首页 > 解决方案 > 取消引用指向从数组指针转换的指针的指针

问题描述

学习 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吗?

标签: cpointers

解决方案


你认为那m是类型int **,对吧?

它不是。如果你这样做了,那将是:

int *m[5];

这会产生一个由五个指向 int 的指针组成的数组,因此m将是指向 int 的指针的指针。

但是,如果您这样做:

int m[5][5];

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


推荐阅读