首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消对从数组指针转换的指针的引用

取消对从数组指针转换的指针的引用
EN

Stack Overflow用户
提问于 2020-03-01 20:52:46
回答 2查看 70关注 0票数 2

学习C语言,这让我很困惑:

代码语言:javascript
复制
#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吗?

EN

回答 2

Stack Overflow用户

发布于 2020-03-01 21:08:47

您认为mint **类型的,对吗?

事实并非如此。如果您这样做了,它将是:

代码语言:javascript
复制
int *m[5];

这使得一个包含5个指向int的指针的数组,所以m将是指向int的指针。

但是,如果您这样做:

代码语言:javascript
复制
int m[5][5];

您可以获得足够的空间来容纳25个int,编译器将以5x5二维数组的形式访问它们。p指向该数组的开头。取消对它的引用,编译器将读取该数组的开头,并将其解释为指向int的指针。改变你填充的数字,你会得到不同的伪指针。

票数 0
EN

Stack Overflow用户

发布于 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;

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60475301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档