![](/img/trans.png)
[英]Two different pointer syntax in C which one is right and what's the difference between the two?
[英]What is the difference between the two syntax?
为什么
(a?b:c)=5;
在“ C”中显示所需的左值,而
*(a?&b:&c)=5;
很好吗? 两者有什么区别?
假设a = 1,对于第一种情况,它给出b = 5,而对于第二种情况,它给出*(&b)=5
。
我不明白的是:如果我们写b=5
或*(&b)=5
会产生什么区别?
如果我们写b = 5或*(&b)= 5,会有什么区别?
第二个获得指向b
指针,然后取消对该指针的引用,将5存储到获得的指针中。
但是,您的问题似乎忽略了真正的问题:为什么它在第二种情况下有效,但在第一种情况下不起作用。 这与C语言中的表达式及其处理方式有关。
?:
运算符的结果是一个值; 具体来说,它是一个右值 。 宽松定义的值是不能在赋值左侧出现的值。 之所以命名它们,是因为它们是赋值在赋值右侧的值。 例如,表达式“ 5”是右值表达式。 你不能做5 = 40;
废话
命名变量是左值。 您可以将左值放在等式的左侧。 表达式a
是一个左值表达式(假设a
是范围内的变量名)。
但是,表达式(a + b)
是一个右值表达式 ,而不是左值。 并且有充分的理由; 你不能再做(a + b) = 30;
比你可能的(5 + 10) = 30;
。
和上面的+
运算符一样, ?:
运算符的结果是一个右值表达式。 这解释了为什么(a?b:c) = 5;
不起作用; 您正在尝试为右值表达式分配值。 那是非法的。
现在,让我们看第二种情况。 我们知道?:
导致一个右值表达式。 现在,这说明了表达式的分类是什么,但是表达式结果的类型又如何呢? 那么,假设b
和c
均为int
S, 类型 (a?b:c)
也被int
。
但是,当您执行(a?&b:&c)
,此表达式的类型为int*
,而不是int
。 它是指向整数的指针 。 这是类型为“指向int
指针”的右值表达式。 它将返回b
的地址或c
的地址。
当您拥有一个int*
,并且使用*
运算符对其进行取消引用时,您会得到什么? 您将得到一个类型为int
的左值表达式 。 由于(a?&b:&c)
是int*
类型的右值表达式,因此,如果取消引用它,将得到int
类型的左值表达式。 此左值将是指任一b
或c
,取决于内容a
。
简单地说,它的工作原理如下:
int *ptr = NULL;
if(a)
ptr = &b;
else
ptr = &c;
*ptr = 5;
您将获得一个指针,该指针可以指向任何特定的内存位置,然后在指向的位置中存储一些内容。 就这么简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.