例10.11输出二维数组有关的值。
#define FORMAT "%D,%D\n"
main()
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
printf(FORMAT,a,*a);
printf(FORMAT,a[0],*(a+0));
printf(FORMAT,&a[0],&a[0][0]);
printf(FORMAT,a[1],a+1);
printf(FORMAT,&a[1][0],*(a+1)+0);
printf(FORMAT,a[2],*(a+2));
printf(FORMAT,&a[2],a+2);
printf(FORMAT,a[1][0],*(*(a+1)+0));
}
运行结果如下:
158,158(第0行首地址和0行0列元素地址)
158,158(0行0列元素地址)
158,158(0行首地址和0行0元素地址)
166,166(1行0列元素地址和1行首地址)
166,166(1行0列元素地址)
174,174(2行0列元素地址)
174,174(第2行首地址)
9,9(1行0列元素的值)
请注意,a是二维数组名,代表数组首地址,但是不能企图用*a来得到a[0][0]的值。*a相当于*(a+0),即a[0],它是第0行地址(本次程序运行时输出a、a[0]和*a的值都是158,都是地址。请注意:每次编译分配的地址是不同的)。a是指向一维数组的指针,可理解为行指针,*a是指向列元素的指针,可理解为列指针,指向0行0列元素,**a是0行0列元素的值。同样,a+1指向第1行首地址,但也不能企图用*(a+1)得到a[1][0]的值,而应该用**(a+1) 求a[1][0]元素的值。
#define FORMAT "%D,%D\n"
main()
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
printf(FORMAT,a,*a);
printf(FORMAT,a[0],*(a+0));
printf(FORMAT,&a[0],&a[0][0]);
printf(FORMAT,a[1],a+1);
printf(FORMAT,&a[1][0],*(a+1)+0);
printf(FORMAT,a[2],*(a+2));
printf(FORMAT,&a[2],a+2);
printf(FORMAT,a[1][0],*(*(a+1)+0));
}
运行结果如下:
158,158(第0行首地址和0行0列元素地址)
158,158(0行0列元素地址)
158,158(0行首地址和0行0元素地址)
166,166(1行0列元素地址和1行首地址)
166,166(1行0列元素地址)
174,174(2行0列元素地址)
174,174(第2行首地址)
9,9(1行0列元素的值)
请注意,a是二维数组名,代表数组首地址,但是不能企图用*a来得到a[0][0]的值。*a相当于*(a+0),即a[0],它是第0行地址(本次程序运行时输出a、a[0]和*a的值都是158,都是地址。请注意:每次编译分配的地址是不同的)。a是指向一维数组的指针,可理解为行指针,*a是指向列元素的指针,可理解为列指针,指向0行0列元素,**a是0行0列元素的值。同样,a+1指向第1行首地址,但也不能企图用*(a+1)得到a[1][0]的值,而应该用**(a+1) 求a[1][0]元素的值。