上课听懵了,下课后自己看了一下午书总结了一下子,觉得起码可以看懂代码了。
如果有错误还请大家指出
引入:一维数组与指针
对于一维数组a[5]={0,1,2,3,4},用指针引用其中元素可以这样定义:
int a[5];
int* p=a;//将首元素地址赋给指针。
此时(p+i)即为a[i]的地址,*(p+i)即为a[i]中元素。
由此,引入二维数组指针。
二维数组与指针
对于二维数组a[2][3],我们知道数组名在一维数组中表示首元素地址,而在二维数组中,老师也应该提到过,a表示的也是首地址,只不过是首行地址,即a是一个行指针。
那么,为什么这样说,什么是行指针和列指针呢?
行指针和列指针
有些自我发挥,便于记忆即可
行指针:二维数组中指向某一行的地址。
列指针:二维数组中指向某一元素的地址。
具体怎么理解,还是要往下看:
对于二维数组a[i][j],可看成由i个元素组成的一维数组,
而a[0],即为首元素地址,可看作a[0]+0,为首元素地址,
则a[0]+j等价于&a[0][j],表示的是二维数组中具体元素的地址,也就是列指针。
对该地址解引用:
*(a[i]+j)~a[i][j]~*(*(a+i)+j)
对于二维数组数组名a,同样看成一维数组,它表示“首元素”地址,只不过在这里,首元素指的是首行,即二维数组数组名表示首行地址,它是一个行指针。
下为例子:
行指针:a+1
&a[1] => &*(a+1) => a+1
列指针:&a[1][0] =>&*(a[1]+0) => a[1]+0
a[1]
*(a+1)
同时,行指针和列指针的转换为:&列=>行;*行=>列。
而区分它们的意义在于判断它们加减常数是针对行,还是列,这在后面学习中有很大作用。
综上,可以较为方便区分行指针和列指针。
数组指针和指针数组
这里小小提一嘴,这两种容易区分不开:
int * p[3] ——> 指针数组(指向指针的数组,每个元素都是一维数组,解引用后可以得到每个数组各元素值)
如*(*(p+2)+1)等价于p[2][1],等效于二维数组的调用
int (*p)[3] ——> 数组指针(指向数组的指针,定义时初始化为具有相同元素个数的一维数组的地址)
讲的不太好,只是当作学指针的一个笔记,多多包涵,(#^.^#)