无法将二维数组赋值给二级指针,如何实现**p[i][j]形式打印?
解决二维数组用
int**指针访问的类型不匹配问题 你遇到的报错核心是类型不匹配:&matrix的类型是int (*)[2][2](指向2x2 int数组的指针),而你试图把它赋值给int**(指向int指针的指针),这两种类型在C语言里是完全不同的,编译器自然会报错。
下面给你两种可行的实现方式,都能让你用类似p[i][j]的形式访问数组元素:
方法1:使用匹配的二维数组指针类型
直接声明和&matrix类型一致的指针,然后通过解引用指针来访问元素:
#include<stdio.h> int main (int argc,const char * argv[]){ int matrix [2][2]={{1,2},{3,4}}; // 声明指向2x2 int数组的指针,和&matrix类型完全匹配 int (*p)[2][2] = &matrix; int i,j; for(i=0;i<2;i++) { for(j=0;j<2;j++) { // 先解引用p得到整个二维数组,再访问[i][j] printf("%d ", (*p)[i][j]); } printf("\n"); // 换行让输出更清晰 } return 0; }
方法2:用指针数组模拟int**的访问方式
如果一定要用int**类型的指针,你需要先创建一个指针数组,把二维数组每一行的地址存进去,再让int**指向这个指针数组:
#include<stdio.h> int main (int argc,const char * argv[]){ int matrix [2][2]={{1,2},{3,4}}; // 指针数组,每个元素存储matrix一行的地址(matrix[i]是第i行的首地址,类型为int*) int *row_pointers[2] = {matrix[0], matrix[1]}; // int**指向指针数组的首地址,此时pp[i]就是row_pointers[i],即第i行的地址 int **pp = row_pointers; int i,j; for(i=0;i<2;i++) { for(j=0;j<2;j++) { printf("%d ", pp[i][j]); } printf("\n"); } return 0; }
额外说明:别混淆二维数组和int**
很多人会误以为二维数组等价于int**,但其实不是:
- 二维数组在内存中是连续存储的一块区域,它退化为指针时,是
int (*)[N](指向一维数组的指针),而不是int**。 int**是指向指针的指针,它指向的是一个存储了多个int*的数组(也就是上面的指针数组),和二维数组的内存布局完全不同。
内容的提问来源于stack exchange,提问作者Ahmet Ufuk
相关产品推荐
相关产品推荐

