详解指向多维数组的指针
1,二维数与指针//输出代码举例void main(){int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};printf(“%u ,%u\n”,a,*a);printf(“%u ,%u\n”,a[0],*(a+0));printf(“%u ,%u\n”,&a[0],&a[0][0]);...
·
1,二维数与指针



//输出代码举例
void main()
{ int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf(“%u ,%u\n”,a,*a);
printf(“%u ,%u\n”,a[0],*(a+0));
printf(“%u ,%u\n”,&a[0],&a[0][0]);
printf(“%u ,%u\n”,a[1], a+1);
printf(“%u ,%u\n”,&a[1][0],*(a+1)+0);
printf(“%u ,%u\n”,a[2],*(a+2));
printf(“%u ,%u\n”, &a[2],a+2);
printf(“%u ,%u\n”,a[1][0],*(*(a+1)+0));
printf(“%u ,%u\n”,*a[2],*(*(a+2)+0));
}
2,关于二维数组指针的详解
我们先介绍一下二维数组和二维数组的指针,二维数组相当于一个特殊的一维数组里面每个元素又是一个一维数组,例如:int a[3][3],
可以看成一个3行的一个列数组,每一列的元素又是一个长度为3的数组,数组名的一个特殊一维数组的首地址,如下:
a(第0行的首地址,也是可以是&a [0])指向a [0],对0行首地址元素的引用就有 *a = a [0];另有a=&a[0]
a + 1(第一行的首地址)指向a [1],有*(a + 1)= a [1];另有a+1=&a[1];下面以此类推,行列指针的转化
a + 2(第二行的首地址)指向a [2],有*(a + 2)= a [2];
a + i(第i行的首地址)指向一个[i]中,有*(a + 1)= a [i]中。
而a[0],a[1],a[2]又是里面一维数组的数组名,因此a[i]可表示i行的首地址:
a[0](第0行第0个元素的地址)指向一个a [0][0],有*(a [ 0 ] +0)= a [0] [ 0 ];
a [0]+1(第0行第1个元素的地址)指向a [0] [1],有*(a [0] +1)= a [0] [1];
a [0] +2(第0行第2个元素的地址)指向a [0] [2],有*(a [0] +2)= a [0] [2]
总结:a[i]+j(第i行第j列个元素的地址)指向a[i][j], 有*(a[i]+j)=a[i][j],
即 * (*(a+i)+j)=a[i][j]。
3,二维数组指针的应用
int a[2][3]={1,2,3,4,5,6};//2行3列的int型数组
int **pp=a;//编译出错,不能用二级指针直接指向二维数组
int (*p)[3]=a;//对,p是指向一维数组的指针,可以指向二维数组
int *p1=a[0];//可以,p1也是一维指针,可以指向二维数组
int *p;
p=&a[0][0]; //因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面
//共有i*4+j个元素,该二维数组的任意i行j列元素可表示为*(p+i*4+j)
int (*p)[4];
p=a; //也可以为p=&a[0]; *(*(p+i)+j)表示任意一个i行j列的元素。
4,二维数组名相关的疑问解释
int a[3][4],则
- 二维数组名是指向行的,“&二维数组名”就指向了整个二维数组。
- "二维数组名[i]" 是指向i行的首元素的。“&二维数组名[i]”就指向了一行
- a表示第0行的首地址,a+1会跳过一行,下面以代码来解释,注意第一列的输出结果地址都一样,但含义不一样
int main()
{
int a[2][3] = {
1, 2, 3,
4, 5, 6
};
printf("&a :%d, &a+1 :%d\n", &a, &a+1);//指向整个二维数组:相差24
printf("a :%d, a+1 :%d\n", a, a+1);//指向一行 相差12
printf("a[0] :%d, a[0]+1 :%d\n", a[0], a[0]+1);//指向每一行的首元素 相差4
printf("&a[0][0]:%d, &a[0][0]+1:%d\n", &a[0][0],&a[0][0]+1);// 相差4
printf("&a[0] :%d, &a[0]+1 :%d\n",&a[0], &a[0]+1);// 相差12
printf("&a :%d, &a+1 :%d\n", &a, &a+1);//相差24
//&a[0][0]跳过了一个元素,&a[0]跳了12个字节(跳过了一行),而&a跳了24个字节(跳过了整个二维数组)
system("pause");
return 0;
}
///////////
///////////输出结果
&a :6356712, &a+1 :6356736
a :6356712, a+1 :6356724
a[0] :6356712, a[0]+1 :6356716
&a[0][0]:6356712, &a[0][0]+1:6356716
&a[0] :6356712, &a[0]+1 :6356724
&a :6356712, &a+1 :6356736
//请按任意键继续. . .

更多推荐




所有评论(0)