上面的是代码部分,下面的是程序运行结果
一直以来都感觉C语言里最难懂的就是数组指针,什么时候加“&”,什么时候加“*”,什么时候不加。今天刚好看到chun_001同学发的帖子(http://www.openedv.com/posts/list/23492.htm),感觉忘得都差不多了,有必要好好回顾总结一下,呵呵ffice ffice" />
代码是在LINUX下敲的,老鸟别笑,在学LINUX暂时就只有这个水平....= =、
代码不难,主要是测试指针的用法。运行结果也贴出来了,下面是我的一些理解,欢迎拍砖
/*************************************************************************************************************/
首先我们定义了二维数组a[2][3],那么
a --毫无疑问,二维数组的数组名,代表整个二维数组的首地址,是一个4字节的地址(那一大串HEX数)。
&a --加上取地址符,我们可以理解它为“取到的数组a的首地址”。
*a --加上指针运算符(或称之为间接访问运算符),表示一维数组a[0]的0号元素的首地址(PS:但是这个不好理解,我们可以使用公式a=*(a+i),一个很好用的公式,这样*a代表的就是a[0],也就是指向数组a[2][3]的第一行)
a[0] --这个就不多说了,数组a[2][3]的第一行的地址,同上。
&a[0][0] -- 加取地址符,表示“取到的a[0][0]的地址”。
/*************************************************************************************************************/
上面的各种表示方式,虽然用起来有些不一样,但是从数值来说,表示的都是同一个地址。参看代码运行结果
/*************************************************************************************************************/
a+1 --表示二维数组a[2][3]的第1行的首地址,移动单位为行,注意类比这个和a[1]+1和*(a+1)+1和&a+1在使用时候的区别(精确到元素,行,还是整个数组,下面有提到)。
a[1] --这个和a[0]大概一样
*(a+1) --用公式,等价于a[1],同上。
&a[1] -- 表示“取到的第1行的首地址”
&a[1][0] -- 表示“取到的a[1][0]的首地址”
/*************************************************************************************************************/
上面的各种表示方式,得到的值都是一样的,指向数组第1行的首地址,可以从代码的运行结果看到,地址全部加了0X0C,表示经过了3个int的元素。
/*************************************************************************************************************/
a[1]+1 --表示指向a[1]行第1个元素,移动单位为元素。
*(a+1)+1 --用公式转换,等于a[1]+1,同上,且移动单位为元素。
*(a[1]+1) --用公式转换,等于a[1][1]
*(*(a+1)+1) --用公式转换,也等于a[1][1]
&a+1 --“&a”表示取到的数组a的首地址,但是需要注意的是加1加的不是一行,而是sizeof(a),即整个数组所占的内存大小,在此处加了0X18,即6个int,24个字节大小,参看运行结果。
内容虽简单,但重在分享,希望能帮到哪怕一位同学,也欢迎老鸟指出错误!(^0^)
图片可能不清晰,传了附件....
|