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 внутренне интерпретируются?
Итак, a - это адрес первого элемента массива, а & a - это адрес массива, но очевидно, что они оба имеют один и тот же адрес.
Однако, когда вы добавляете (или вычитаете) число из указателя, компилятор принимает во внимание размер данных, поэтому в вашем случае (при условии, что размер int равен 4 байтам) a + 1 будет больше a на 4 потому что вы перемещаете указатель на одно целое число вперед, но & a + 1 будет больше на 40, потому что вы переместите указатель на один ARRAY OF 10 INTEGERS вперед.
Оба утверждения выводят адреса и, вероятно, предназначены для объяснения арифметики указателей.
a
и &a
НЕ одно и то же, они имеют разные типы, но содержат один и тот же адрес памяти.
&a
имеет тип int (*)[10]
(который действует как указатель на массив)
a
имеет тип int [10]
(который действует как указатель на один элемент)
Поэтому при сложении 1 помните об этих типах. Указатель будет смещен на размер типа, который содержит адрес. a+1
смещается на размер int, т.е. на второй элемент массива. &a+1
смещение полностью за весь массив.