C中的棘手指针算法:** k
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中的棘手指针算法:** k相关的知识,希望对你有一定的参考价值。
假设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
,其中第一个*
是二元乘法运算符。您应该显示教科书中显示的确切文本。
除了标准所说的,从根本上解除引用int是没有意义的。假设编译器愿意假设int可以直接转换为指针(BIG假设)。编译器假设它是什么类型的指针?唯一安全的假设是void*
。取消引用void*
是没有意义的,因为即使在分配给已知类型时,指针的类型仍然很重要:
unsigned int n = 0xFFFFFFFF;
void *pN = &n;
unsigned int fromIntPtr = *(unsigned int*)pN;
unsigned int fromCharPtr = *(unsigned char*)pN;
printf("%X\n", fromIntPtr);
printf("%X\n", fromCharPtr);
输出:
FFFFFFFF
FF
由于缺少一种指针,编译器可能会根据LHS表达式推断出unsigned int*
。那是1)一个非常愚蠢的推论和2)C并不能真正推断出类型。 (将类型化的RHS推入不同类型的LHS值不是推论:))
以上是关于C中的棘手指针算法:** k的主要内容,如果未能解决你的问题,请参考以下文章