学习C语言,这让我很困惑:
#include <stdio.h>
int main(){
int m[5][5];
int count = 0;
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
m[i][j] = count++;
}
}
int **p = m;
int (*k)[5] = m;
printf("%p\t%p\t%p", *p, *k, *m);
return 0;
} 这就是打印出来的内容:0x100000000 0x7ffff1fc9d70 0x7ffff1fc9d70
我真的很困惑为什么取消引用*p是0x100000000,它不应该是0x7ffff1fc9d70吗?
发布于 2020-03-01 21:08:47
您认为m是int **类型的,对吗?
事实并非如此。如果您这样做了,它将是:
int *m[5];这使得一个包含5个指向int的指针的数组,所以m将是指向int的指针。
但是,如果您这样做:
int m[5][5];您可以获得足够的空间来容纳25个int,编译器将以5x5二维数组的形式访问它们。p指向该数组的开头。取消对它的引用,编译器将读取该数组的开头,并将其解释为指向int的指针。改变你填充的数字,你会得到不同的伪指针。
发布于 2020-03-01 21:08:58
您可能会假设int m[5][5];是一个包含指向整数数组的数组指针的数组。这个假设是错误的:int m[5][5];实际上是一个存储在内存中的扁平一维数组。因此,语句int **p = m;无效。您应该使用int *p = m;语句。修改语句后,您现在应该看到*m不是一个指针,而是存储在数组中的整数的值(实际上是第一个)。
更新:
因为对于C标准,int*和int[5][5]是不兼容的类型。执行数组的一种更正确的方法是使用int *p = &m[0][0];,而不仅仅是int *p = m;。
https://stackoverflow.com/questions/60475301
复制相似问题