关于指针,结构体指针的一点记录

本文讨论了uint32_t变量与指针在存储地址上的差异,强调了指针的多功能性,包括数据类型标识、内存操作和结构体操作。同时,讲解了结构体的地址分配、内存对齐问题,以及在嵌入式系统中可能的闪存存储策略。

uint32_t变量存储的32bit地址,和指针变量存储的是不一样的。

uint32_t变量,只是一个存数据的容器,其仅仅存储数值,这个数据可能是地址,也可能是别的。

而指针变量,则不同,它具有更多的功能,除了存储地址值,还能表示数据类型,还能用*操作符引用数据,以及+,-等指针地址运算。 这些是uint32_t类型不具备的功能。

所以uint32_t data仅用于存储32位整数

而 uint32_t *ptr 可用于存储,并操作内存地址

数据类型

存储的信息

表示数据能力

引用操作

指针运算符

uint32_t data

存普通数据

仅数据本身

= 号取值赋值

仅对数值运算

void *ptr

uint32_t *ptr

struct_t *ptr

存的是地址+指针类型信息(在编译时候会用)

可以是任何类型, uint32_t *

甚至是结构体

struct_t *

不指定类型等等

void *

用*可以引用内存中的值进行取值赋值

可以跨函数,直达内存

对地址进行跨度计算+1 ,-1 表示跨过多少个指针数据类型的地址

在对指针的运算中,比如struct_t * ptr , ptr+1,那么就相当于跨过一个结构体的跨度,指向下一个地址。

比如这个结构体是64byte空间,那么,ptr+1,就是下一个64byte地址的头。结构体多大,就跨多大。

其实用指针操作结构体,也和操作数组有点相似, 因为他们都是一种顺序的数据结构。存储在内存中。

只不过结构体,可以把不同类型的数据打包,存到一起。 而数组不行。

在调用数据的时候,可以通过指针->变量名,来获取结构体中的数据

如果不想用-> ,或者. 变量名来获取数据,也可以通过该变量精确的地址来获得其中的数据。 但这样,必须要知道这个指针的地址,然后再配合该变量在结构体里的地址偏移量,来确定该变量的地址,再取值。

当然,这可能会有变量对齐的问题。因为结构体里的存储需要对齐,编译器会塞入一些空数据。

结构体本身没有确定的地址。当我们定义一个结构体变量时,这个变量会被分配在内存的某个位置,这个位置由编译器决定。只有在定义结构体变量并给它赋值后,它才会在内存中有确定的地址。

关于在flash中初始化:通常,flash内存是用于存储程序代码或常量数据的,而不是用于存储运行时变量的。因此,一般不会将结构体直接初始化在flash内存中。

但在某些嵌入式系统或特殊应用中,可能会将某些数据结构或配置信息存储在flash中,比如一些出厂参数。 或者使用FLAH来模拟EEPROM做一些硬件参数存储的时候。 会需要指定地址。 那么你需要确保flash中的那个地址开始有足够的空间存放整个结构体,然后你可以将那个flash的地址赋值给结构体指针,这样结构体指针就指向了flash中的那个地址。

然后你再去初始化那个结构体就可以了。

程序在运行时的结构体通常不需要指定地址,因为他在内存中,以一组结构来保存数据,只有在初始化的时候,才会被分配。在RAM中,它可以实时修改,作为系统运行时存储变量的一种结构。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值