首先,看下面一个简单的程序
#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是最直接的输出方法。