2011-11-17 66 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;