2011-11-17 64 views
1

只是要清楚的事实,我想问问混淆引用操作

int i = 1; 
int *p = &i; 
i = *p; 

你所说页上操作*做?被称为与第3行相同的解除引用运算符?

+4

这是我更喜欢“int * p”语法而不是“int * p”的原因之一。 –

回答

2
int i = 1; 
int *p = &i; 

*是声明的语法的一部分。 int *p表示p的类型为int*

i = *p; 

*是一个引用操作。

但是,两者使用相同的语法并不是巧合。 C的(看似怪异的)声明语法主要基于“声明遵循使用”的原则。阅读声明

int *p; 

的方法之一是,它宣称*pint类型。由此可见,p的类型为int*。同理:

int *a, b, c[20]; 

*abc[blah]都是int类型,所以aint*类型,bint类型,cint[20]型。 (请注意,声明和使用之间的对应关系是不完美的; c[20]是刚刚过去的数组的末尾,而实际上并不存在。)

这就是为什么(思想至少在一所学校)的*在指针声明旁边是标识符,而不是类型。

4

*在这种情况下不是运算符,它是一个声明符。当应用于某个类型时,它会将其变成指向该类型的指针。

您可以将int*视为一种类型。

写作这种方式使得它更清晰:

int i = 1; 
int* p = &i; 
i = *p; 
+1

但是,引入认为'INT * A,B的危险;''做了'和'B'两个指针。将它作为'int * p'实际上更紧密地遵循语言语法。 –

+0

@KeithThompson我编辑了一下。希望我的措辞正确。 – Pubby

+0

实际上,它被称为声明符运算符。当它用作类型的前缀时,它将声明一个指向类型的指针。 – cpx

6

这是一个指向声明的例子:

int *p = &i; 

这是一个引用操作的例子:

i = *p; 

运算符只适用于变量,不适用于类型,它们不是一回事。

+1

这不仅是*指针声明*;它更多。它是*指针定义和初始化*。 – Nawaz

1

这是一个指针声明,而不是解除引用操作符。

cplusplus.com tutorial

我想强调的是,星号(*),我们当 声明指针只使用意味着它是一个指针(这是它的 型复合符的一部分),并且不应该与我们之前看到的 解引用运算符相混淆,但它也是用星号(*)编写的 。他们只是两个不同的东西用相同的符号表示。

0

要以这种方式

int *p = &i; 

是有点难以理解定义指针。我建议你使用这个(注意空格)

int* p = &i; 

但会有这样的方式确定一个以上的指针时的一个问题:

int* p = &i, * q = NULL; 

所以比较清楚,先定义指针类型,并使用该类型来定义变量:

typedef int* int_ptr; 
int_ptr p = &i, q = NULL;