2013-07-15 2 views
1

, например, у меня естькакая разница между стоимостью возвращаемого таНос() и имя массива

char* c=(char *)malloc(100*sizeof(char)); 
printf("0x%x,c); 
printf("0x%x,&c); 

и это будет показано различное значение для c и &c.

Однако, если я м, имеющий следующее:

char d[100]; 
printf("0x%x,d); 
printf("0x%x,&d); 

это показывает, что значение d и &d являются одинаковыми.

Каким образом первый код дает мне отличный результат для c и &c?

+0

Возможно, вы имели в виду declare 'char * c' вместо malloc? –

+0

@ChrisO Я, это была опечатка. Благодарю. Я исправил это. – henryyao

+0

Читайте: [Что возвращает sizeof (& arr)?] (Http://stackoverflow.com/questions/15177420/what-does-sizeofarr-return/15177499#15177499) Объясняет разницу между 'd',' & d' –

ответ

6

Массив распадается на указатель на свой первый элемент во многих контекстах, включая его использование в вызове функции. Это не распад, когда это операнд унарного & (адрес-оператора). Это означает, что d и &d дают тот же адрес в вашем примере, но имеют разные типы. char * и char (*)[100], соответственно, в вашем случае.

В отличие от этого, c является указателем. Когда вы берете свой адрес с &, вы получаете адрес переменной указателя, в отличие от прямого использования c, который дает вам адрес, на который он указывает. c - char *, а &c - char **.

Редакционное примечание. Используйте для печати типы указателей для использования %p. %x подходит к unsigned int, а unsigned int может отличаться от указателя. Исправленный код может выглядеть так:

printf("%p\n", (void *)c); 
Смежные вопросы