C数组中的指针地址

C数组中的指针地址,c,arrays,string,pointers,C,Arrays,String,Pointers,C中字符串的名称是一个常量值,其中包含字符串第一个元素的地址。现在我的问题是:为什么这个常量变量和他的指针包含相同的地址 char str[] = "hola"; printf("%p %p", &str, str); 此代码的输出为: 0x7ffc9ab53f43 0x7ffc9ab53f43 但是我希望读取两个不同的地址。让我们看看数组是如何存储在内存中的(插入了指向元素的指针): +--------+--------+--------+--------+--------+ |s

C中字符串的名称是一个常量值,其中包含字符串第一个元素的地址。现在我的问题是:为什么这个常量变量和他的指针包含相同的地址

char str[] = "hola";
printf("%p %p", &str, str);
此代码的输出为:

0x7ffc9ab53f43 0x7ffc9ab53f43

但是我希望读取两个不同的地址。

让我们看看数组是如何存储在内存中的(插入了指向元素的指针):

+--------+--------+--------+--------+--------+ |str[0]| str[1]| str[2]| str[3]| str[4]| +--------+--------+--------+--------+--------+ ^ | &str[0] | &str 指针
&str[0]
(这是
str
衰减到的)指向数组的第一个元素。数组的第一个元素也是数组本身的地址。因此
(void*)&str[0]==(void*)&str
是正确的。

请查看此链接

试试这段代码(它帮助我深入理解这个问题)

#包括
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));
}
+--------+--------+--------+--------+--------+ | str[0] | str[1] | str[2] | str[3] | str[4] | +--------+--------+--------+--------+--------+ ^ | &str[0] | &str
#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));
}