Почему “a+1” и “&a+1” дают различные результаты когда международного массива?

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);
}

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

10
задан Nietzche-jou 7 June 2010 в 12:44
поделиться

2 ответа

Итак, a - это адрес первого элемента массива, а & a - это адрес массива, но очевидно, что они оба имеют один и тот же адрес.

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

12
ответ дан 3 December 2019 в 14:33
поделиться

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

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

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

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

21
ответ дан 3 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: