我有使用指针的中等知识。一些语法样式让我感到困惑。
像:
*(uint8 *) (a) = (b)
func(unsigned char * a);
,但它被用作func((unsigned short *) &b);
....据我所知,他们正在将一个预期的char类型指针转换为short。 任何人都可以帮我理解这些陈述在C中的确切含义吗?
答案 0 :(得分:0)
第一个简单地将(a)
转换为指向无符号8位整数的指针,然后将评估(b)
的结果写入结果地址(作为8位数字)。
第二个不是有效的,它不应该编译。也许你记错了,它有点粗略。
答案 1 :(得分:0)
要了解C中定义的含义,请查看左右规则,它非常简单,并解释了很多http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html。它基本上意味着你从名字开始,然后向右移动建立定义,然后只有当你无法向右移动时向左移动。这可能听起来很奇怪,但让我们以数字1为例。
*(uint8 *)(a)=(b)
所以第1步是什么?从变量的名称开始,在本例中是变量。然后看看右侧定义了什么,这里什么都没有,所以移动到右边的部分,即(uint8 )。这意味着a是指向uint8的指针。好的,现在从uint8 向右移动,然后你回到a,这意味着你不能再向右移动,所以去吧,那就是你*,这是解除引用a。因此,对于该行,存储在地址a的uint8被设置为b的值。
好的第二部分我认为func((unsigned short *) &b)
是他们开始定义函数体的地方吗?如果是这种情况,那么对于函数体而言,传入的参数用作指向unsigned short的指针,但是如果像这样调用函数,我认为编译器不会因为函数类型不匹配而感到高兴期待unsigned char *
而不是unsigned short *
。