В C, используются ли указатели на массивы или как указатели?

Насколько я понимаю, массивы были просто постоянными указателями на последовательность значений, и когда вы объявляли массив в C, вы объявляли указатель и выделяли место для последовательности, на которую он указывает.

Но это меня смущает: следующий код:

char y[20];
char *z = y;

printf("y size is %lu\n", sizeof(y));
printf("y is %p\n", y);
printf("z size is %lu\n", sizeof(z));
printf("z is %p\n", z);

при компиляции с Apple GCC дает следующий результат:

y size is 20
y is 0x7fff5fbff930
z size is 8
z is 0x7fff5fbff930

(моя машина 64-битная, указатели имеют длину 8 байтов).

Если y - постоянный указатель, почему он имеет размер 20, как последовательность значений, на которые он указывает? Заменяется ли имя переменной 'y' адресом памяти во время компиляции, когда это необходимо? Значит, массивы своего рода синтаксический сахар в C, который просто переводится в указатель при компиляции?

45
задан salvador p 5 January 2011 в 17:26
поделиться