例如,我有
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 :(得分:6)
数组在许多上下文中衰减为指向其第一个元素的指针,包括它在函数调用中的使用。当是一元&
(地址)运算符的操作数时,不会衰减。这意味着d
和&d
在您的示例中产生相同的地址,但具有不同的类型。
char *
和char (*)[100]
。
相反,c
是一个指针。当您使用&
获取其地址时,您将获得指针变量的地址,而不是直接使用c
,这将为您提供指向的地址。 c
为char *
,&c
为char **
。
编辑说明:使用%p
打印指针类型。 %x
适用于unsigned int
,unsigned int
可能与指针的大小不同。更正的代码可能如下所示:
printf("%p\n", (void *)c);