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中,它可以实时修改,作为系统运行时存储变量的一种结构。
本文讨论了uint32_t变量与指针在存储地址上的差异,强调了指针的多功能性,包括数据类型标识、内存操作和结构体操作。同时,讲解了结构体的地址分配、内存对齐问题,以及在嵌入式系统中可能的闪存存储策略。

被折叠的 条评论
为什么被折叠?



