通过指针了解间接地址并获取地址

时间:2018-12-13 05:56:58

标签: c pointers language-lawyer unary-operator

在标准N1570Section 6.5.3.2#3中,指定了以下内容(临时矿):

  

如果操作数是一元*运算符的结果,则两者都不是   运算符和&运算符都被求值,结果就像   除了对操作员的约束仍然适用之外,省略了   和 结果不是左值

6.5.3.2#4部分的后面指定:

  

如果操作数指向一个函数,则结果为一个函数   代号;如果它指向一个对象,则 结果为左值    指定对象

这两个部分与我看起来矛盾。我引用的第一个参数指定result is not an lvalue,但是第二个参数指定间接运算符的结果是一个左值。

您能解释一下吗?这是否意味着在使用对象的情况下,运算符*&不会互相抵消吗?

1 个答案:

答案 0 :(得分:4)

第6.5.3.2#3节讨论一元&运算符,而6.5.3.2#4节讨论一元*运算符。他们有不同的行为。

详细说明(from comment):

要点是,一元&不会导致左值,即使在将其忽略的情况下也是如此,因为在取消引用上下文中一元*紧接在一元&之前。只是因为两个运算符都被忽略了,但这并不会改变结果表达式不是左值的事实。如果应用独身的int a; &a = ...; 则不会如此。

int a; 
&*a = ...;

(显然)是非法的。

&*

仅仅因为它们被忽略了并不意味着a等于左using System.Net; string content = ""; using (WebClient client = new WebClient ()) // WebClient class inherits IDisposable { content = client.DownloadString("http://yoursite.com/content.txt"); } 的左值。