Форум программистов, компьютерный форум CyberForum.ru

Неясности в теории - C++

Восстановить пароль Регистрация
 
 
Benzema
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 58
11.10.2015, 19:55     Неясности в теории #1
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
И еще один вопрос, для чего нужен знак % в данной функции:rand()%1999-999. То, что это функция заполнения рандомными числами,я знаю, но вот для чего там знак % ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2015, 19:55     Неясности в теории
Посмотрите здесь:

Подсчёт выражения. Разработка программы и неясности с функцией pow C++
C++ Вопросы по теории
Немного теории C++
C++ Вопросы по теории C++
Неясности в работе программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 11:42     Неясности в теории #61
Rius
Вот, правильные слова
Цитата Сообщение от gru74ik Посмотреть сообщение
Потому что в С++ обычные сишные массивы не являются объектами первого класса
По существу, в на низком уровне, на уровне C, вообще нет абстракции массива! Есть только последовательная память. И Вам остаётся только два варианта: обернуть эту память в свою абстракцию или оперировать низкоуровневыми возможностями -- адресами.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
12.10.2015, 14:13     Неясности в теории #62
Цитата Сообщение от hoggy Посмотреть сообщение
указатель на массив так же, как и ссылка на массив помнит размерности
hoggy, честно сказать, я тоже не понял, как указатель может хранить (помнить?) размер массива. Насколько я знаю, обычный сишный указатель хранит адрес и ничего более. И в случае передачи обычного сишного массива в функцию указатель хранит именно адрес первого элемента массива. Откуда ж там ещё возьмётся информация о размере массива? Вот это я никак в толк не возьму.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
12.10.2015, 14:25     Неясности в теории #63
Цитата Сообщение от gru74ik Посмотреть сообщение
честно сказать, я тоже не понял, как указатель может хранить (помнить?) размер массива. Насколько я знаю, обычный сишный указатель хранит адрес и ничего более. И в случае передачи обычного сишного массива в функцию указатель хранит именно адрес первого элемента массива. Откуда ж там ещё возьмётся информация о размере массива? Вот это я никак в толк не возьму.
Он говорил о типизации, о времени компиляции, а не о времени исполнения.
Тип `указатель на массив` содержит в себе информацию о размере массива.
C++
1
T (*p)[N];
На основе этой информации можно, например, делать перегрузку, или выбирать специализацию шаблона.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 17:30     Неясности в теории #64
DrOffset
Цитата Сообщение от DrOffset Посмотреть сообщение
Тип
К тому и вопросы пошли. Указатель -- это, всё-таки, указатель, адрес. А его типовая метка отвечает за проверку времени компиляции. Но никто ничего не хранит.

А если отвечать слишком приблизительно и расплывчато, то это всё равно, что и не отвечать.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
12.10.2015, 20:36     Неясности в теории #65
Цитата Сообщение от mporro Посмотреть сообщение
Как передать массив в функцию, чтобы все побочные эффекты работы с массивом внутри функции не затронули внешний контекст
там где то выше был пример передачи по значению за счет промежуточной структуры.

Цитата Сообщение от gru74ik Посмотреть сообщение
Либо пользоваться средствами нового стандарта (C++14), как это сделал hoggy (передавать ссылку или указатель и использовать ключевое слово auto).
не обязательно использовать auto.
auto - это лишь синтаксический сахар.
выше где то были мои примеры,
как получить такой же результат при помощи "классических" шаблонов.

если же количество элементов прибито гвоздями,
то можно передавать ссылку/указатель на массив без всяких шаблонов.

Цитата Сообщение от mporro Посмотреть сообщение
Нет, это не то. Вы передали в функцию структуру, совершенно иной объект. Структура действительно скопируется, но это уже данные, определённые пользователем.
формально, нельзя передавать массивы по значению.
но это - не более чем формальность.

отталкиваться то нужно от задачи.
можно например на шаблонах поиметь нужный эффект,
без необходимости порождать пользовательскую структуру в клиентском коде:

Цитата Сообщение от gru74ik Посмотреть сообщение
а заполнить массив новыми значениями в такой же манере получится?
в какой, в такой же?

Добавлено через 2 минуты
Цитата Сообщение от gru74ik Посмотреть сообщение
честно сказать, я тоже не понял, как указатель может хранить (помнить?) размер массива. Насколько я знаю, обычный сишный указатель хранит адрес и ничего более.
верно.
ключевые слова "обычный сишный указатель".

"указатель на массив" - это не "обычный сишный указатель".

C++
1
2
3
int ar[] ={1,2};
int* p = ar; //<--- указатель на int (не намассив)
int (*pa)[2] = &ar ; //<--- указатель на массив
указатель на массив хранит информацию о природе массива в своем типе.

Добавлено через 5 минут
Цитата Сообщение от mporro Посмотреть сообщение
К тому и вопросы пошли. Указатель -- это, всё-таки, указатель, адрес. А его типовая метка отвечает за проверку времени компиляции. Но никто ничего не хранит.
указатель - это тип данных.
адрес - это значение объекта имеющего тип данных "указатель".

понятно, что "циферки" ничего не хранят.
но это не принципиально.

принципиально, что в статике можно пропасти тип указателя-на-массив,
и поиметь информацию о его размерностях.

с++ позволяет много различной нужной информации извлекать времени компиляции.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 20:40     Неясности в теории #66
Цитата Сообщение от hoggy Посмотреть сообщение
но это - не более чем формальность.
Это гораздо больше, чем формальность. Это следствие того, что абстракции массива в C просто нет. В Pascal есть массивы, например.
В C++, конечно, тоже есть массивы, выраженные уже в терминах новых для C методов "абстракции".

Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
указатель - это тип данных.
Да, соглашусь.
Тем не менее, стоило сделать акцент именно на том, что разной длины массивы могут быть выражены разными типами данных, а не говорить, что кто-то что-то "хранит".
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
12.10.2015, 20:44     Неясности в теории #67
Цитата Сообщение от mporro Посмотреть сообщение
что абстракции массива в C просто нет
есть там все.
есть моральный тип массива.
есть моральный тип указателя-на-массив.

Добавлено через 1 минуту
Цитата Сообщение от mporro Посмотреть сообщение
Тем не менее, стоило сделать акцент именно на том, что разной длины массивы могут быть выражены разными типами данных, а не говорить, что кто-то что-то "хранит".
тип данных именно хранит информацию о типе элементов,
и обо всех размерностях массива, на который он указывает
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 20:50     Неясности в теории #68
Цитата Сообщение от hoggy Посмотреть сообщение
есть моральный тип указателя-на-массив.
Нет. Я не буду длить с Вам эту дискуссию.
Но Ваши иллюзии точно не стоит транслировать новичкам, которые потом будут только путаться в относительно простом языке, выискивая там несуществующие массивы.

Цитата Сообщение от hoggy Посмотреть сообщение
тип данных именно хранит информацию о
В С тип данных ничего не "хранит". По факту Вы можете только сравнить типовые метки, может быть компилятор даже не использует чисел в описании этих меток. Употреблять столь сильное слово -- пагубная страсть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 21:01     Неясности в теории
Еще ссылки по теме:

Некоторые неясности с задачей C++
Некоторые неясности с задачей C++
непонятность по теории C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
12.10.2015, 21:01     Неясности в теории #69
Цитата Сообщение от mporro Посмотреть сообщение
Но Ваши иллюзии точно не стоит транслировать новичкам, которые потом будут только путаться в относительно простом языке, выискивая там несуществующие массивы.
мои иллюзии описаны в стандарте языка си.

все что осталось понять новичку:

1.
что массив может неявно каститься к указателю на свой первый элемент.
но сам по себе такой указатель не имеет нималейшего отношения к массивам.

то, что он на самом деле смотрит на начало массива - это лишь в голове программиста.
с точки зрения компилятора - он смотрит тупо на какой-то одиночный объект.

2.
что существует тип данных "указатель-на-массив".
и вот его компилятор интерпритирует,
именно как указатель на сам массив.

такой тип данных несет в себе информацию о природе массива,
на который он указывает.

Цитата Сообщение от mporro Посмотреть сообщение
В С тип данных ничего не "хранит"
все он хранит.
сишка в этом смысле отличается лишь раздолбайством:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include  <stdio.h>
 
// <--- expected ‘const int (*)[3]’ but argument is of type ‘const int (*)[2]’
void foo( const int (*pArr)[3] )
{
    for(size_t n=0;n<3;++n)
        printf("%d, ", (*pArr)[n] );    
}
 
int main(void)
{
    printf("Hello, world!\n");
    
    const int a[]={1,2};
    
    // <--- warning: passing argument 1 of ‘foo’ from incompatible pointer type
    foo(&a);
    
    return 0;
}
а так же невозможностью использовать статическую информацию времени компиляции.
Yandex
Объявления
12.10.2015, 21:01     Неясности в теории
Ответ Создать тему
Опции темы

Текущее время: 14:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru