如何理解二维数组的指针变量:
例如:a[3][4]是一个二维数组,a是二维数组的数组名,按照之前一维数组的理解,它指的是整个数组的首地址,首先想到的其应该是a[0][0]的地址,其实从逻辑上来讲这是不对的,虽然数值确实一样。因为二维数组是元素为一维数组的数组,即a[3][4]指的是一个数组,其中数组元素是a[0],a[1],a[2],a[3],其都是含有五个元素的一维数组。
所以*a应该指向a[0],即a中存放的是a[0]的地址,那么按照这种理解,*a的值为a[0]的值,而a[0]也是一个指针变量,它指向的是第一行数组的首地址,即a[0][0]的地址。
所以,*a指向的是a[0];*a[0]指向的是a[0][0];
输出样例:
a = 6487536
a[0] =6487536
*a = 6487536
*(a+0) = 6487536
a[0][0] =*a[0]= 1
a[0][0] =*(*a)= 1
a[0][3]=4
a[0][3]=4
a[0][3]=4
a[3]的地址为*((a+0)+3)=6487548
--------------------------------
Process exited after 0.02294 seconds with return value 0
请按任意键继续. . .
代码如下:
#include<stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{12,14,15,18},{23,28,29,30}};
printf("a = %d\n",a);
printf("a[0] =%d\n",a[0]);
printf("*a = %d\n",*a);
printf("*(a+0) = %d\n",*(a+0));
printf("a[0][0] =*a[0]= %d\n",*a[0]);
printf("a[0][0] =*(*a)= %d\n",*(*a));
printf("a[0][3]=%d\n",*(a[0]+3));
printf("a[0][3]=%d\n",*(*a+3));
printf("a[0][3]=%d\n",*(*(a+0)+3));
printf("a[3]的地址为*((a+0)+3)=%d\n",*(a+0)+3);
return 0;
}
输出样例二:
a=6487536,*a=6487536
a[0]=6487536,*(a+0)=6487536
a[1]=6487552,*(a+1)=6487552
&a[0]=6487536,&a[0][0]=6487536
a[1]=6487552,a+1=6487552
&a[1]=6487552,*(a+1)+0=6487552
a[2]=6487568,*(a+2)=6487568
&a[2]=6487568,a+2=6487568
a[1][2]=13,*(a[1]+2)=13
*(*(a+1)+2)=13
--------------------------------
Process exited after 0.02533 seconds with return value 0
请按任意键继续. . .
代码如下:
#include<stdio.h>
int main()
{
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
printf("a=%d,*a=%d\n",a,*a);
printf("a[0]=%d,*(a+0)=%d\n",a[0],*(a+0));
printf("a[1]=%d,*(a+1)=%d\n",a[1],*(a+1));
printf("&a[0]=%d,&a[0][0]=%d\n",&a[0],&a[0][0]);
printf("a[1]=%d,a+1=%d\n",a[1],a+1);
printf("&a[1]=%d,*(a+1)+0=%d\n",&a[1],*(a+1)+0);
printf("a[2]=%d,*(a+2)=%d\n",a[2],*(a+2));
printf("&a[2]=%d,a+2=%d\n",&a[2],a+2);
printf("a[1][2]=%d,*(a[1]+2)=%d\n",a[1][2],*(a[1]+2));
printf("*(*(a+1)+2)=%d",*(*(a+1)+2));
return 0;
}