C中的语法理解:指针

Syntax understanding in C: Pointers

我对使用指针有中等的了解。有些语法风格让我感到困惑。

喜欢:

  1. *(uint8 *) (a) = (b)
  2. 在函数中解析引用时对引用进行类型转换。该函数的原型为 func(unsigned char * a); 但它被用作 func((unsigned short *) &b); .... 据我所知,他们正在将预期的 char 类型指针转换为 short。

谁能帮我理解这些语句在 C 中的确切含义?

第一个简单地将 (a) 转换为指向无符号 8 位整数的指针,然后将计算 (b) 的结果写入结果地址(作为 8 位数字)。

第二个无效,不应编译。可能你记错了,有点粗略。

要了解 C 中定义的含义,请查看右-左规则,它非常简单并且解释了很多内容 http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html。它的基本意思是,您从名称开始,然后向右移动以构建定义,然后仅当您无法向右移动时才向左移动。这听起来可能很奇怪,但让我们以数字 1 为例。

  1. *(uint8 *) (a) = (b)

    那么第一步是什么?从变量的名称开始,在本例中是 a。然后看那个右边定义的是什么,这里什么都没有,所以直接转到右边的部分,也就是(uint8)。这意味着 a 是指向 uint8 的指针。好的,现在从 uint8 向右移动,然后回到 a,这意味着您不能再向右移动,所以向右移动,这会得到 *,这是取消引用 a。因此对于这一行,存储在地址 a 的 uint8 被设置为 b 的值。

  2. 好的,对于第二部分,我认为 func((unsigned short *) &b) 是他们开始定义函数体的地方?如果是这种情况,那么对于函数体来说,传入的参数用作指向无符号短整型的指针,但是如果像这样调用函数,我认为编译器不会满意,因为函数的类型不匹配期待 unsigned char * 而不是 unsigned short *