OpenEdv-开源电子网

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

结构体 结构体指针 结构体数组 结构体数组指针 混用的深入探讨

[复制链接]

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2010-12-3
在线时间
2 小时
发表于 2011-4-28 16:49:27 | 显示全部楼层 |阅读模式
今天有空又学习了下结构体和指针,这个地方一直是很迷惑我的地方,今天找了个小例子跟大家探讨下,
已经明确的内容:

typedef struct 
 char  in0;
 char  in1;
} struct0a_type;


struct0a_type  aa; 定义一个结构体
struct0a_type  *bb;定义一个指向这种结构体的指针
struct0a_type  cc[4]定义一个结构体的数组 这个数组的每一个元素都是一个结构体;
&aa  这个结构体的地址
bb=&aa   将结构体aa的地址赋给指针bb

(*bb).in0和aa.in0是等价的

bb=&cc;   将结构体cc的地址赋给指针bb


bb.in0和 cc.in0 是等价的
以上已经验证过是正确的

仍有疑问的内容


现在问题来了
(*bb).in0中的  *bb以及 
aa.in0中的aa的内容是什么,应该是一个指针?

bb.in0和 cc.in0 等价
bb本身是一个指针,那bb也应该是一个指针,那么
cc.in0中的cc,aa.in0中的aa也应该是指针咯?


还有一个问题  下段程序中并没有直接声明bb这个数组
但为什么就可以直接使用bb.in0代替 cc.in0?下段代码在Keil中编译的。 
typedef struct 
 char  in0;
 char  in1;
} struct0a_type;
struct0a_type  *bb;
struct0a_type  cc[4]
 
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2011-4-28 16:55:19 | 显示全部楼层
回复【楼主位】PomCat:
-------------------------------
但为什么就可以直接使用bb.in0代替 cc.in0?下段代码在Keil中编译的。 
typedef struct 

 char  in0;
 char  in1;
} struct0a_type;
struct0a_type  *bb;
struct0a_type  cc[4]

这里如果bb没申明,你用的话,估计会有个hard fault的错误.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2010-12-3
在线时间
2 小时
 楼主| 发表于 2011-4-28 17:36:16 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
没明白
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2011-4-28 18:00:22 | 显示全部楼层
回复【3楼】PomCat:
-------------------------------
刚刚测试了一下,没fault,但是数据不对.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2011-10-20 11:53:36 | 显示全部楼层
回复【楼主位】PomCat:
---------------------------------
cc[4] 数组中的 方括号 表示一种运算、cc 代表 地址,数组名和结构名代表其首地址,举个例子:

int a[4];
int *b = a;
则 a[3] = b[3] = *(b + 3) = *(3 + b ) = 3  = 3[a]

在编译的时候总是将 a[3] 理解成 *(a + 3) ,再翻译成指令就会是一种 “基址偏移寻址” 指令
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-29 07:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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