c - C 中棘手的指针算术 : **k

标签 c pointers

假设 k 是一个指向 C 中整数的指针。

对于表达式**k,当我们尝试在赋值运算符(“=”)的右侧对其求值时,该值会是非法的吗?

这是我的想法:

**k 实际上是 *(*k)。当我们取消引用 k 时,我们得到一个整数的值。然后我们尝试取消引用一个整数,这是一个非法操作。

但是我的教科书说右边的这个表达式实际上是合法的。

为什么会这样?

最佳答案

C 2018 标准在第 6.5.3.2 条第 2 段中规定,“一元 * 运算符的操作数应具有指针类型。”如果k是一个指向整数的指针,那么*k是一个整数,它不是指针类型,所以它不能是一元*的操作数 运算符。因此,诸如 x = **k 之类的表达式违反了此规则。

ins 6.5.3.2 2 中的规则是一个约束,这意味着需要符合标准的编译器才能生成诊断消息,而 C 标准并未定义该行为。

从技术上讲,C 编译器除了发出诊断消息之外,还可以接受表达式并根据需要进行定义。我不知道有任何这样做,并且没有通用编译器这样做。

字符 **k 可能会出现在一些较大的表达式中,但它们并不同时充当一元 * 运算符,例如在 x = 中y**k,相当于x = y * *k,其中第一个*是二进制乘法运算符。您应该显示教科书中显示的准确文本

关于c - C 中棘手的指针算术 : **k,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54777726/

相关文章:

c - 如何定义跨多个 .c 文件可见的全局变量

c++ - 将十六进制转储转换为 double

c - 制作 Target 依赖源列表

c - 如何使用原始名称为库函数创建包装器?

objective-c - 赋值还是 memcpy?设置数组成员变量的首选方法是什么?

c - 增加在数组指针数组中实现的数组的最后一行?

c - char * 和 char (*) 的区别[25]

C++ 数组和指针调用类型

c++ - 将一个数组的引用分配给另一个数组 - "warning: target of assignment not really an lvalue"

c++ - 函数的指针参数