为何指向数组的指针自身地址与数组首元素地址不同?
指针自身地址与数组首元素地址不一致是否正常?
问题描述
当使用指针指向数组时,发现指针自身的内存地址与所指向数组下标[0]的内存地址不一致,测试代码及输出如下:
测试代码
#include <stdio.h> int main() { int arr[5]; arr[0] = 10; arr[1] = 20; arr[2] = 30; arr[3] = 40; arr[4] = 50; int *p = &arr; printf("Memory address of first index: %p\n", &arr[0]); printf("Memory address of pointer: %p\n", &p); return 0; }
输出结果
Memory address of first index: 000000000061FE00
Memory address of pointer: 000000000061FDF8
请问该现象是否正常?是不是我的机器出现故障了?
解答
这是完全正常的现象,和机器故障没有任何关系。
- 指针
p本身是一个变量,它和数组arr一样存储在栈内存中,&p取的是这个指针变量自身占用的内存地址。 - 而
&arr[0]是数组首元素的内存地址,指针p的作用是存储这个数组首地址的值,而非要求指针自己的地址和数组首地址一致。
简单来说:指针是一个用来存放地址的容器,容器自己有专属的存放位置(&p),容器内部装载的是数组的首地址(p的值),这两个地址本来就不是同一概念。你可以打印p的值验证,它会和&arr[0]完全相同:
printf("Value stored in pointer p: %p\n", p);
这个输出会和&arr[0]的地址完全一致。
内容的提问来源于stack exchange,提问作者Ifeoluwa Joel
相关产品推荐
相关产品推荐

