C语言中数组名、数组首元素及自定义指针的地址关系疑问
C语言中数组名、数组首元素及自定义指针的地址关系疑问
咱们先把你问的两个问题拆开来聊清楚哈,你的结论其实是完全正确的,给你点个赞!
首先说第一个问题:数组名的地址和数组首元素的地址数值是相同的。在C语言里,数组名(比如a)在绝大多数场景下会被隐式转换成指向数组首元素的指针,所以当你打印a、&a[0]甚至&a的时候,会看到它们的内存地址数值完全一样——因为数组的首元素本来就存在整个数组内存块的起始位置,所以这几个指向的是同一块内存的起点。不过要注意,它们的类型是不一样的:&a是指向整个数组的指针(比如如果是int a[5],那&a的类型就是int (*)[5]),而a和&a[0]是指向单个int元素的指针(int *),但数值上确实是同一个地址。
然后是第二个问题:你定义的指针p自己的地址,和数组首元素、数组名的地址完全不同。指针p本身是一个独立的变量,它有自己的内存空间(通常在栈上),它的作用只是把a[0]的地址值存了进去而已。打个比方,就像你把朋友家的地址写在小本子上,小本子自己有个存放位置(这就是&p),而小本子上写的朋友家地址是&a[0],这俩肯定不是一回事对吧?
咱们可以用一段代码直观验证一下:
#include <stdio.h> int main() { int a[5] = {1,2,3,4,5}; int *p = &a[0]; printf("&a[0] 的地址: %p\n", &a[0]); printf("数组名a转指针后的地址: %p\n", a); printf("&a(整个数组的地址): %p\n", &a); printf("指针p保存的地址值: %p\n", p); printf("指针p自己的地址&p: %p\n", &p); return 0; }
运行这段代码你会发现,前四行打印的地址数值是一样的,但最后一行&p的地址和前面完全不同,这就完美印证了你的结论。
总结一下核心点:
- 数组首元素地址、数组名隐式转换后的指针地址、整个数组的地址,数值相同,指向数组内存的起始位置;
- 自定义指针
p的自身地址是独立的,它只是存储了首元素的地址值,和数组相关的地址没有关系。
备注:内容来源于stack exchange,提问作者Mohd Saq
相关产品推荐
相关产品推荐

