OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5868|回复: 7

关于C中数组指针的一些个人见解,欢迎纠正

[复制链接]

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-11-2 16:15:28 | 显示全部楼层 |阅读模式


 上面的是代码部分,下面的是程序运行结果


    一直以来都感觉C语言里最难懂的就是数组指针,什么时候加“&”,什么时候加“*”,什么时候不加。今天刚好看到chun_001同学发的帖子(http://www.openedv.com/posts/list/23492.htm),感觉忘得都差不多了,有必要好好回顾总结一下,呵呵fficeffice" />

代码是在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,表示经过了3int的元素。


/*************************************************************************************************************/

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,即6int24个字节大小,参看运行结果。

 

 

内容虽简单,但重在分享,希望能帮到哪怕一位同学,也欢迎老鸟指出错误!(^0^

图片可能不清晰,传了附件....

代码.jpg
运行结果.jpg
博观而约取,厚积而薄发。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-2 18:41:20 | 显示全部楼层
我顶,谢谢745021926 的分享
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

19

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-7-23
在线时间
0 小时
发表于 2013-11-2 19:47:17 | 显示全部楼层
楼主也在学linux C吗? 嘻嘻 共勉!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-2 21:08:00 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-11-2 21:13:25 | 显示全部楼层
最近也在看C,强调楼主说的一点
&a,是取a的对象,并转换为对象的指针,即楼主声明的2维数组,+1的结果就是移动一个对象的距离,6个int,24字节[32位]。
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-11-2 21:16:52 | 显示全部楼层
通常从编译器的实现反推是可以的,但要想透彻的理解,建议看标准文档,如C99、C11
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
 楼主| 发表于 2013-11-3 21:52:44 | 显示全部楼层
回复【6楼】styleno1:
---------------------------------
恩恩,推荐几个文档吧!
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
 楼主| 发表于 2013-11-3 22:12:30 | 显示全部楼层
回复【3楼】chun_001:
---------------------------------
Linux这东西...哎...
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 03:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表