2013-08-29 71 views
-1

的性質我感到困惑以下兩個聲明之間:混淆*操作

int *p=&a; //first 

int *p; //second 
p=&a; 

的Asterisk *不作爲引用操作。大多數我看到的地方是*充當解除引用操作符。我的問題是,除第一種情況外,是否有任何情況下*運算符不作爲解除引用運算符?

+2

乘法運算符? – nouney

+0

@nouney你一定是在開玩笑...... – chanzerre

+2

_is有任何情況下,*運營商不作爲解除運算符??? _,從你的問題的兄弟 – nouney

回答

2

*僅作爲解除引用運算符僅在表達式中。

C聲明的(不可否認的)語法是基於「聲明遵循使用」的思想。因此,這些聲明:

int i; 
int *p; 

可以讀作 「iint」 和*pint。由於*pint,因此p必須是指向int的指針。

(當然*也乘法運算符,如果出現有兩個操作數)。

1

在聲明語句*被認爲不是一個引用操作,但一個類型說明符的一部分。 int *p表示p is a pointer to int,您的第一行也將其初始化爲地址a。第二行在正常的賦值語句中將a的地址分配給p

p仍然只是一個變量持有的東西。最好是分配給其他變量的地址,但是你可以隨意分配它(有些編譯器會讓它變得困難),然後通過取消引用來破壞程序!

0

&運算符返回變量a的內存地址,因此p將指向變量a的內存位置。

*運營商被稱爲間接deference運營商。它返回指向的內存位置的內容。

int *p; p被聲明爲指針,以int
p = &a;則p指向的a

1

地址雖然在C標準的正式定義是不同的,*不會像在聲明一個引用操作。 C聲明背後的概念是它們顯示了表達式的類型。例如,int *p;本質上說,「當我提領p,其結果應該是一個int」。

所以,雖然這不是deferences p一個表達式,它說明一個。

+0

我同意你的看法,爲了取消引用'p'我們寫'* p',而'p'表示指針變量本身,'* p'表示指針指向的int。 – boleto