You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言中如何获取指向数组的指针自身的存储地址?

搞懂数组名和指针的区别:为什么str和&str地址相同?

嘿,这个问题绝对是C语言新手最容易踩的坑之一,我来给你把逻辑理清楚~

首先你得纠正一个核心误解:char str[] = "test";里的str不是指针变量!它是数组的名字,本质上是整个数组的“别名”,并不是一个存储着地址的指针。数组名在大多数场景下会被隐式转换成指向数组第一个元素的指针,但它本身并没有独立的内存空间来存储这个地址——它直接代表数组所在的内存块。

我们来拆解你的代码:

  1. printf("%p\n", str);
    这里数组名str被转换成char*类型的指针,指向数组的第一个元素't',所以输出的是数组首元素的起始地址。
  2. printf("%p\n", &str);
    这里&str是取整个数组的地址。因为数组的起始位置就是首元素的位置,所以这个地址的数值和首元素地址完全相同。但要注意,它们的类型不一样:str转换后是char*,而&strchar (*)[5](因为"test"加上末尾的结束符\0,一共是5个字符的数组)。

那你问的“获取str自身的地址”——其实因为str不是指针变量,根本不存在一个专门存储它地址的内存位置。如果非要得到类似“指针变量自身地址”的东西,你需要先把数组地址存到一个真正的指针变量里,再取这个变量的地址:

char str[] = "test";
char *ptr = str; // 定义一个指针变量ptr,存储数组首元素的地址
printf("%p\n", &ptr); // 这里输出的就是ptr这个变量自身的内存地址

你之前想的char **super_pointer = str;是错误的,因为str转换成char*,不能直接赋值给char**类型。如果要这么写,应该是char **super_pointer = &ptr;,但其实完全没必要这么绕,直接取ptr的地址就够了。

总结一下:

  • 数组名≠指针变量,它没有自己独立的内存地址,它的“地址”就是数组本身的起始地址,和首元素地址数值一致
  • 如果需要一个可寻址的指针来存储数组地址,就定义一个指针变量指向数组,再取这个变量的地址

内容的提问来源于stack exchange,提问作者Eric

火山引擎 最新活动