我正在学习C
。我开始理解指针和类型转换。我跟着一些指南和例子,我跑过这个宣言:
uint32_t *sp;
...
*(uint32_t*)sp = (uint32_t)somevalue;
这里发生了什么?对我来说,第一个星号对我来说是一个谜。
答案 0 :(得分:4)
打破它:
*(uint32_t*)sp
基本上是将sp
视为指向uint32_t
的指针((uint32_t *)
是演员表达式),并取消引用结果。
所以,
*(uint32_t*)sp = (uint32_t)somevalue;
表示“接受somevalue
,将其转换为uint32_t
类型,并将结果存储到sp
个指向的内容,并将该内容视为uint32_t
1}}“。
请注意sp
上的广告素材是多余的;你已经已经将它声明为指向uint32_t
的指针,因此该作业可以写成
*sp = (uint32_t) somevalue;
答案 1 :(得分:2)
第一个星号取消引用sp
指针,以便将somevalue
的值赋给指针对象。
我想知道为什么演员,因为这个
*sp = (uint32_t) somevalue;
如果sp
属于uint32_t *
类型,则可以。
答案 2 :(得分:0)
第一个星号是indirection operator。
基本上是在指针所占据的地址获取/访问值。
引用C11
标准,章节§6.5.3.2,地址和间接运算符
一元
*
运算符的操作数应具有指针类型。
和
一元
*
运算符表示间接。如果操作数指向函数,则结果为 功能指示符;如果它指向一个对象,结果是一个左值指定 宾语。 [...]
答案 3 :(得分:0)
第一个明星解除引用sp
后,将其转换为指向uint32_t
的指针,以便将somevalue
写入该位置。
但是,由于sp
已经是指向uint32_t
的指针,因此无需强制转换。此外,如果somevalue
是数字类型,则右边的强制转换也是不必要的,因为rvalue将隐式转换为左值的类型。
答案 4 :(得分:0)
你的困惑源于这不是一个声明,而是一个任务声明:
/* This is the declaration of sp as a pointer to uint32_t */
uint32_t *sp;
/* This is an assignment statement setting *sp to somevalue */
*(uint32_t*)sp = (uint32_t) somevalue;
它看起来很容易像一个声明,因为不必要地抛出左值使得它看起来像是在声明类型。