如何理解指向二维数组的指针

如何理解指向二维数组的指针/ 如何用二维数组名表示行地址、元素地址、元素值

在下在复习C语言时,发现自己理解C语言中指向二维数组的指针十分困难。
在抓耳挠腮反复冥想之后,思考出一种较为笨拙但实用的办法来理解关于二维数组指针的运用。
以下只是在下的一点拙见,若有错误之处还望各位大神指正!

1 各种变量、指向一维数组的指针的使用

在定义一个变量的同时也建立了变量名和地址的对应表,C语言对变量的访问都是通过地址进行的。
定义指针可以 int *p = 10000; 但只有在确定 10000~10003四个字节的数据是安全的才不会出错。为确保安全,尽量使用 int *p = &a ;的形式。
在使用循环读取数组的值时,可以采以下办法
for(p=a;p<(a+10);p++) printf(“%d”,p);
若int型数组a的首地址为10000,则第一次p=p+1会使得p = 10004 ,其判断语句p<(a+10)即为p<10040
指针相减:
float a[10]={1,2,3};
float *p = a;
float *q = a+2;
printf("%d\n",q-p);
return 0;

打印出的值为2,这种用法只有在p和q都指向同一个数组内的元素才有意义,得出的值是两个指针所指元素相隔的同类型的储存单元个数。

指针与自增自减*p++、*++p、*–p、*p–:
*、++、-- 均为单目运算符,结合方向自右向左。
*p++ 即为 *(p++) ,先传出p指向的值,然后使p指向下一个位置。
*++p 即为 *(++p) ,先让p指向下一个位置,然后传出p指向的值。
*- -p 即为 *(- -p) , 先让P指向上一位置,然后传出p指向的值。
*p- - 即为 *(p- -) , 先让传出p指向的值,然后使p指向上一个位置。
++*p 即为++(*p) , 先让p指向的值自增1,然后传出p指向的值。
–*p 即为- -(*p) , 先让p指向的值自减1,然后传出p指向的值。
int a[10];
(1)数组名字a代表的是a[0]的元素地址;a+n是指a[n]的元素地址。
(2)&a 代表的是数组a的行地址,虽然&a与a两者值相同,但物理意义不同,不能等价。
(3)*(a+n)无条件等价于a[n]

2 用二维数组名表示行地址、元素地址、元素值

int A[10][10] ; 为方便理解,可以将此二维数组理解为定义了十个一维数组:a0[10]、a1[10]、…、a10[10]

把A[0][0]用a0[0]表示、A[0][1]用a0[1]表示、A[0][2]用a0[2]表示、… 、A[0][10] 用a0[10]表示;其他以此类推。
根据一维数组的上述(1)、(2)、(3)点,再补充一点 A = *&A ;
见到A[n]+m,就将其看作an+m(一维数组名字an),an+m表示的是an[m]的地址,那么A[n]表示的就是n行m列的元素地址;
也可以理解以下二维数组的指针写法:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值