什么指针魔术是这个

时间:2016-02-05 16:43:31

标签: c pointers casting dereference

我正在学习C。我开始理解指针和类型转换。我跟着一些指南和例子,我跑过这个宣言:

uint32_t *sp;
...
*(uint32_t*)sp = (uint32_t)somevalue;

这里发生了什么?对我来说,第一个星号对我来说是一个谜。

5 个答案:

答案 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;

它看起来很容易像一个声明,因为不必要地抛出左值使得它看起来像是在声明类型。