c - 指针变量的大小存储在哪里?

标签 c arrays pointers

 #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/

相关文章:

c++ 指向字符串数组的指针

c++ - 将空数组传递给函数,填充数组并获取值

c++ - CMake zlib 在 Windows 上构建

c - C 编程语言(第二版): Exercise 1-15 (Celsius to Fahrenheit conversion) - What is wrong with my solution?

c - 为什么内存地址在一个地方上升而在另一个地方下降?

c++ - 在 C 中初始化一个 char 数组。哪种方式更好?

c++ - 通过指针访问三维数组

c - 错误 `./px' : free(): invalid next size (normal)Aborted (core dumped)

c - OpenMP:并行工作负载中无加速

JavaScript - 将项目分组到数组中