2014-09-05 52 views
3

在Objective-C,我实在无法理解这一点:定义一个指向相同变量名称引用的引用的指针?

void *x = &x;

我的理解是:

声明泛型指针(因此,类型为void *),指针变量名称为x,而这指针指向一个名为x的变量的引用(,应该声明它已经 - 但它不是)。

非常令我困惑!

+0

请添加评论作为评论你想评论的答案。或者也为自己的问题添加一个答案。 – alk 2014-09-05 09:54:45

+0

“应该被宣布 - 但它不是” - 是的。宣言的要点来自*起始者之前。一旦你明白了,意思应该清楚。 – 2014-09-05 10:54:25

+0

相关:http://stackoverflow.com/q/16270323/694576 – alk 2014-09-05 10:55:52

回答

2

对于C和C++:

x被分配自己的地址。事后指向自己。

+0

这并不能解释如何在同一行上为自己指定一个变量的地址(在这种情况下,它是指针)你声明:/ – JBL 2014-09-05 09:51:37

+0

gcc管理这个没有任何抱怨。 @JBL – alk 2014-09-05 09:53:09

+0

所以完全取决于编译器来弄清楚这种特殊情况?我无法找到可以解释这种情况的标准中的任何相关内容。 (然后,这远不是我会说的微不足道的)。 – JBL 2014-09-05 09:57:09

0

基于@alk答案的理解:

正是因为你说:

int y = 10; 
void* x = &y; 

但出来的情况下,X点本身,而不是y

5

总括是否声明

void *x = &x; 

是有效的,您应该考虑C标准中的两个重要引号。

第一个表示其中的标识符开始的部份范围(标识符6.2.1作用域)

7结构,联合和枚举标签具有范围,标签的出现之后开始只是 一个声明 标签的类型说明符。每个枚举常量的范围在枚举器列表中定义的枚举器出现后立即开始。 任何 其他标识符的范围仅在其声明者 完成后开始。

第二个说,任何类型的指针是否可以被分配给一个指向void(6.3.2.3指针)

1中的孔隙的指针可被转换成或从一个指针到任何 对象类型。 指向任何对象类型的指针可能会被转换为 指针,并返回空值;结果应该等于 的原始指针。因此,在这个声明

void *x = &x; 

variabble x的范围内立即赋值运算符之前启动。它的完整类型是void *,它可以被分配任何其他类型的指针。在右边有void **类型的表达式。根据第二个引用,它可以分配给x,因为x是指向void的指针。

由于结果x将存储它自己的地址。

+0

谢谢,有关标识符范围开始的部分确实是可以回答问题的部分。 – JBL 2014-09-05 11:06:55