Инкремент идентификатора массива

Вы могли бы прокомментировать данный код.


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 шт):

Автор решения: KoVadim

В си и с++ массивы очень интересные объекты. Если передать обычный 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, то здесь проблема:)

→ Ссылка