#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);
printf("%d %d\n",*(a+1),*(ptr-1));
return 0;
}
输出:
2 5
这里在*ptr= (int*)(&a+1)
语句中&a
没有加1。实际上它就像 &a + sizeof(a)
。现在我的问题是指针变量的大小存储在哪里,或者如果它没有存储那么它是如何计算的。对于 int、float、char
等,它们的大小是在编译器中预定义的,因此 int *a
是不同的情况。只有地址存储在指针变量中是真的吗?关于指针变量的元数据存储在哪里?
最佳答案
由于您的变量声明 int a[5] = ...
,编译器知道 a
的类型是 int [5]
(因此,sizeof(a)
将返回 20)。由于编译器知道 a
的类型,因此获取 a
的地址将产生正确类型的指针。这可能有点令人惊讶:&a
不会产生 int**
,而是产生 int (*)[5]
(指向五个整数的数组)。
所以在执行的时候
int *ptr=(int*)(&a+1);
你把 a
的地址加一(由于 C/C++ 指针算法的工作方式,将指针引用的地址增加 sizeof(a)
bytes),然后将结果转换为 int。所以此时,ptr
指向数组最后一个元素的后面(偏移量为 20)。
然后您将指针转换为 int*
并使用 *(ptr-1)
,因此您取消引用偏移量 16 处的 int 值 - 这恰好是最后一个数组元素是。
关于c - 指针变量的大小存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201142/