C中字符串的名称是一个常量值,其中包含该字符串第一个元素的地址。现在我的问题是:为什么这个常量变量和他的指针包含相同的地址?
char str[] = "hola";
printf("%p %p", &str, str);
此代码的输出是:
0x7ffc9ab53f43 0x7ffc9ab53f43
但是我希望读取两个不同的地址。
答案 0 :(得分:1)
让我们看一下数组如何存储在内存中(插入指向元素的指针):
+--------+--------+--------+--------+--------+ | str[0] | str[1] | str[2] | str[3] | str[4] | +--------+--------+--------+--------+--------+ ^ | &str[0] | &str
指针&str[0]
(str
衰减到的指针)指向数组的第一个元素。数组的第一个元素也是数组本身的地址。因此(void *) &str[0] == (void *) &str
是正确的。
答案 1 :(得分:0)
查看此链接Pointer address in a C array
并尝试使用此代码(它有助于我深入了解问题)
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
int (*ptr2)[sizeof(arr)/sizeof(*arr)] = &arr;
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(*arr));
printf("%d\n",sizeof(ptr2));
printf("%d\n",sizeof(*ptr2));
}