首先,看下面一个简单的程序
#include <stdio.h> #define FORMAT "%d\n" int main(int argc, char *argv[]){ int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; printf(FORMAT,*(*(str))); return 0; }
输出结果: 1
解释: 二维数组名 str 是指向行 的,指向以为数组str[0],即0行首地址
*str 是指向列 的,代表0行0列元素地址,等同于str[0]
加* 行 指针变列 指针
加& 列 指针变行 指针
接着,我们引入指针变量p
#include <stdio.h> #define FORMAT "%d\n" int main(int argc, char *argv[]){ int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int (*p)[3]; p=str; printf(FORMAT,*(*(p))); return 0; }
输出结果: 和上面一样 还是1
把二维数组的首地址(即0行地址 行地址)赋给指针变量P
好吧,我们要注意的问题要出现了
//程序1 #include <stdio.h> #define FORMAT "%d\n" int main(int argc, char *argv[]){ int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int (*p)[3]; p=str; printf(FORMAT,*(*p+4)); return 0; }
//程序2 #include <stdio.h> #define FORMAT "%d\n" int main(int argc, char *argv[]){ int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int (*p)[3]; p=str; printf(FORMAT,*(*(p+1)+1)); return 0; }
//程序3 #include <stdio.h> #define FORMAT "%d\n" int main(int argc, char *argv[]){ int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; printf(FORMAT,str[1][1]); return 0; }
程序1、 2、3 运行的结果都是 5
注意 :比较程序1、2的第8行程序,程序1是用的(序号为4的数字,序号从0开始)输出二维数组的数字,而程序2用的是(即第1行第1列,行列的序号都是从0开始,切记!!!) ;
程序3是最直接的输出方法。