Инкремент идентификатора массива
Вы могли бы прокомментировать данный код.
int foo (int , int mass[10]);
int main (void)
{
int cnt = 10;
int mass [10];
int * prt = mass;
// mass ++; // error
//mass = prt; //error
printf ("prt = %p\n", prt);
printf ("mass = %p\n", mass);
foo (cnt, mass);
return 0;
}
int foo (int cnt, int mass[10])
{
int * prt = NULL;
prt = mass;
mass++ ; //ok ?
mass = prt; //ok ?
printf ("prt = %p\n", prt);
printf ("mass = %p\n", mass);
for (int i= 0; i < cnt ; ++i)
i[mass] += i;
return mass[10];
}
В основном цикле закомментированы ошибки. и это логично. тк эти операции с массивами запрещены. но в функции такие операции разрешены?
Я передаю массив как параметр. Функция приводит идентификатор массива к указателю на int? Где об этом можно почитать ?
Ответы (1 шт):
В си и с++ массивы очень интересные объекты. Если передать обычный int в функцию, то он скопируется, а вот массив - нет, скопируется указатель на него.
Также массивы умеют "деградировать" (decay) в указатель на его первый элемент. И они умеют это делать так хорошо, что иногда кажется, что массив и указатель на первый элемент - одно и тоже. Но это не так.
Как доказать, что внутри функции у Вас не массив? попробуйте просто распечатать его размер
printf("%d", sizeof(mass));
и тут станет понятно, что здесь указатель. И поэтому, вся арифметика указателей работает.
Где почитать? например, здесь https://stackoverflow.com/questions/6567742/passing-an-array-as-an-argument-to-a-function-in-c и там написано, что
int foo (int cnt, int mass[10])
равно
int foo (int cnt, int mass[])
и равно
int foo (int cnt, int* mass)
(и это все указатель, и размер не передается)
P.S. в конце есть строка return mass[10]; и так как размер массива 10, то здесь проблема:)