2012-04-20 3 views
4

Вот код, который я написал, чтобы проверить/понять поведение указателей/в массивеСтранное поведение указателя массива в C

int main(void){ 
    int a[4]; 
    memset(a, 0, sizeof(a)); 
    printf("%x %x\n",a,&a); 
} 
Output of the above program on my machine: 
bfeed3e8 bfeed3e8 

Я не могу понять, почему значения а и & a такой же. Из того, что я понимаю, & a должен указывать адрес ячейки памяти, где хранится. Какое объяснение такого поведения?

+0

Также возможно дублирование [Адрес массива] (http://stackoverflow.com/questions/8412694/address-of-array) –

ответ

9

&a действительно дает вам адрес a. a дает вам a, который, поскольку это массив, распадается на указатель на a.

Или быть педантичным, он распадается на указатель на a[0].

+6

Чтобы быть педантичным, он распадается на указатель на 'a [0]'. –

+0

Вот что я сказал! Не ждите, это не то, что я сказал, я только сделал вид, что я это сказал. Сожалею. –

+1

Разница между педантизмом и педантизмом (что совпадает с разницей между результатом 'a' decaying и' & a'), является типом. Массив имеет тот же адрес, что и его первый элемент, но тип '& a' -' int (*) [4] ', тогда как тип' & a [0] '-' int * ' –

4

В этом контексте имя массива a распадается на указатель на его первый элемент. Возможно, вы имели в виду

printf("%x %x\n",a[0],&a); 
0

Имя массива также указывает на начало блока памяти, который он удерживает. Никакой большой.

Они эквивалентны:

printf("%x\n",a); 
printf("%x\n",&a); 
printf("%x\n",&a[0]); 
0

В контексте указателей, массивы распадаются на указатель. Таким образом, a распадается на адрес первого байта массива, а &a - это адрес первого байта по определению. Вероятно, вы хотели использовать *a или a[0] вместо &a в вашем printf.

0
int test[10]   = test is pionter as well as &test 

Если вы хотите обратиться элемент, кроме основания, используйте & тест [4]

BTW

&test = @test[0] = test 

все указатели на базовый элемент

0

имя массива «а "указывает первый элемент массива.

для лучшего понимания:

*(a + 2) is same with a[2]. 
0

В C, имя массива, в данном случае a считается меткой, и представляет собой адрес массива. Применение к нему ампсера интерпретируется как одно и то же.

Существует аналогичная проблема с указателями функций. Если func является указателем на функцию, вы можете вызвать функцию, используя как func(), так и (*func)().

Имеются случаи синтаксиса косвенности, обработанные особым образом.

1

Выражение &a имеет тип int (*)[4] (указатель на 4-элементный массив int) и вычисляет адрес объекта массива; в этом отношении указатели на массивы подобны указателям на что-либо еще.

Что такое хинки, как обрабатывается выражение a. За исключением случаев, когда он является операндом операторов sizeof или унарных & или является строковым литералом, используемым для инициализации другого массива в объявлении, выражение типа «N-элементный массив T» заменяется на/преобразование в/"распады "к выражению типа T * (указатель на T), значением которого является адрес первого элемента в массиве. Поскольку адрес массива и адрес первого элемента в массиве одинаковы, оба выражения дают то же значение , но их типов различны.

Смежные вопросы