Почему "a + 1" и "& a + 1" дают разные результаты, когда "a" является массивом int? - PullRequest
10 голосов
/ 07 июня 2010
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,0};

    printf("a = %u , &a = %u\n",a,&a);
    printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}

как а и а внутренне интерпретируются?

Ответы [ 2 ]

21 голосов
/ 07 июня 2010

Оба оператора выводят адреса и, вероятно, предназначены для объяснения арифметики указателей.

a и &a НЕ являются одинаковыми, они имеют разные типы, но содержат один и тот же адрес памяти.

&a имеет тип int (*)[10] (который действует как указатель на массив)
a имеет тип int [10] (который действует как указатель на один элемент)

Поэтому, когда вы добавляете 1, помните об этих типах. Указатель будет смещен на размер типа, который содержит адрес. a+1 смещается на размер типа int, то есть на второй элемент в массиве. &a+1 смещает полностью за весь массив.

12 голосов
/ 07 июня 2010

Ну, а это адрес первого элемента массива, а & а это адрес массива, но, очевидно, они оба имеют одинаковый адрес.

Однако, когда вы добавляете (или вычитаете) число из указателя, компилятор учитывает размер данных, поэтому в вашем случае (при условии, что размер int равен 4 байтам), a + 1 будет больше, чем на 4 потому что вы перемещаете указатель на одно целое число вперед, но & a + 1 будет больше на 40, потому что вы больше на один указатель на одну Массив на 10 целых чисел вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...