二维数组的指针变量

如何理解二维数组的指针变量:

例如: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;
 } 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值