我很困惑... a 到底是什么?据说是char*类型的
如果您像这样定义数组:char a[5] = "hill;"。
那么以下成立:
1. a implicitly decayed to char *: decayed to a pointer to the first element
2. &a[0] is of type char *: pointer to the first element
3. &a is of type char (*)[5]: pointer to an array which starts at the first element
它们都指向相同的内存地址,但它们属于不同的类型。请注意,在情况 1 中,数组名称将为 decayed。
哦,好吧,打印出完全相同的地址。请解释一下,这里发生了什么
这意味着如果您打印出a 或&a 的地址,它将是相同的。另请记住,如果您想打印地址,请将指针转换为 void* 而不仅仅是 int。
它是一个指针,它的值必须是第一个字符的地址。并且 a 本身必须有一个地址。当然,这两个地址必须不同,因为 a 是 char* 类型,并且它保存的地址指向 char。
假设a 隐含地指向第一个元素,你是对的。此外,这个变量还有一个地址,指向某物的值存储在该地址中。
编辑#1:
以上证明:
因为几个 cmets 受到挑战,我对 a、&a[0] 和 &a 的解释就是证明。因此我写了这个不编译的 C 代码:
int main()
{
char a[5];
double b;
/* the following fails */
b = a; /* decay to char * */
b = &a[0]; /* char * */
b = &a; /* char (*)[5] */
}
编译器将失败并输出错误和预期的类型。
../src/SO_Test_C.c:6:7: error: incompatible types when assigning to type ‘double’ from type ‘char *’
b = a;
^
../src/SO_Test_C.c:7:7: error: incompatible types when assigning to type ‘double’ from type ‘char *’
b = &a[0];
^
../src/SO_Test_C.c:8:7: error: incompatible types when assigning to type ‘double’ from type ‘char (*)[5]’
b = &a;
^
sizeof():
这是不同的 sizeof() 操作返回的内容:
sizeof(a) --> Array size: 5
sizeof(&a[0]) --> Pointer size: 8 (64bit) / 4 (32bit)
sizeof(&a)) --> Pointer size: 8 (64bit) / 4 (32bit)