C中的语法理解:指针
Posted
技术标签:
【中文标题】C中的语法理解:指针【英文标题】:Syntax understanding in C: Pointers 【发布时间】:2015-09-02 15:15:26 【问题描述】:我具有使用指针的中等知识。有些语法风格让我感到困惑。
喜欢:
*(uint8 *) (a) = (b)
在函数中解析引用时对引用进行类型转换。该函数的原型为func(unsigned char * a);
,但它被用作func((unsigned short *) &b);
...。据我所知,他们将预期的char类型指针转换为short。
谁能帮我理解这些语句在 C 中的确切含义?
【问题讨论】:
请输入tour 并提供minimal reproducible example。您可能还想阅读How to Ask。 【参考方案1】:要了解定义在 C 中的含义,请查看左右规则,它非常简单并且解释了很多 http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html。这基本上意味着您从名称开始并向右移动以建立定义,然后仅当您无法向右移动时才向左移动。这可能听起来很奇怪,但让我们以数字 1 为例。
*(uint8 *) (a) = (b)
那么第 1 步是什么?从变量的名称开始,在这种情况下是 a。然后看看那个右边定义了什么,这里什么都没有,所以移动到右边的部分,即(uint8 )。这意味着 a 是指向 uint8 的指针。好的,现在从 uint8 向右移动,然后你回到 a,这意味着你不能再向右移动,所以向右移动会得到*,这是取消引用 a。所以对于这一行,存储在地址 a 的 uint8 被设置为 b 的值。
好的,第二部分我认为func((unsigned short *) &b)
是他们开始定义函数体的地方?如果是这种情况,那么这意味着对于函数体,传入的参数被用作指向无符号 short 的指针,但是如果像这样调用函数,我认为编译器不会因为函数的类型不匹配而感到高兴期待unsigned char *
而不是unsigned short *
。
【讨论】:
谢谢,我记得读过我学校的右手边规则,如果我不明白,我就是这样读的,但是使用括号总是让我失望..例如在 1. 我开始从右转看到一个括号关闭,然后我开始向左移动,uint8 周围又有一个括号,你如何解释?? 把括号想象成他们自己的小世界。你先在括号内做所有事情,然后再移动一个。例如,如果您有 int[] * a (int *)。您将从 a 开始,然后向右移动到 (int *)。当您在名称后面看到 () 时,这意味着它是接收参数的函数。所以这里我们有一个作为函数的函数,它接受一个指向 int 的指针作为参数。在此之后你不能再向右走,所以你向左走*。所以我们得到 a 是一个函数,它接收一个指向 int 的指针作为参数,返回一个指向...的指针你不能向左走,所以你再次向右走 [] 所以我们有 a 作为一个函数,将一个指向 int 的指针作为参数返回一个指向...数组的指针。再一次,你不能向右走,因为你已经向右走,所以你向左走带你到“int”,这给我们留下了我们的最终答案“a 是一个函数,它接受一个指向 int 的指针作为参数,返回一个指向 int 数组的指针”。我可能不太擅长解释这一点,所以请阅读帖子中的链接,这很清楚。还可以查看这个将 C 声明翻译成英文的网站cdecl.org【参考方案2】:第一个简单地将 (a)
转换为指向无符号 8 位整数的指针,然后将计算 (b)
的结果写入结果地址(作为 8 位数字)。
第二个无效,它不应该编译。也许你记错了,看起来有点粗略。
【讨论】:
在第二个例子中,'b' 可能是 'unsigned short b;',不是吗?我认为它的编译取决于 C 实现...¿? @jabujavi:问题不在于&b
转换为unsigned short*
(嗯,确实如此,但不会是编译时错误)。问题是调用带有unsigned char*
参数和unsigned short*
参数的函数。
@unwind .... 是的,我认为编译器也应该抛出一个错误,但我没有记错
@unwind .... 是的,我认为编译器也应该抛出错误,但我没有记错函数定义:int func(unsigned char *ptr),它被用作 func((unsigned short *)&a),其中 a 定义为“短”。我向你保证,它可以编译和工作,因为这段代码在过去 15 年的现场机器上运行......就使用而言,当解析一个短类型指针时,定义会将其类型转换为 char 类型指针??
因为指向字符类型的指针可以访问任何类型的对象,所以第二个例子不一定是未定义的。以上是关于C中的语法理解:指针的主要内容,如果未能解决你的问题,请参考以下文章