2017-02-23 111 views
-1

我知道->運算符可以是變量方向的指針,但爲什麼用它的時候有指針運算符*,有什麼區別,可以嗎喜歡一個在另一個?例如:->運算符與指針之間的區別*(C++)

a*b 

指是指向B(好吧,我可能是錯誤的原諒我,因爲我是一個初學者?)

是它等同於a->b

and a<-b含義b是指向?

如果是這樣,是否有可能依靠->,因爲它更簡單?

+1

你似乎誤解了什麼' - >'手段。它並不意味着任何方向,它只是取消引用指向結構成員訪問的結構的指針。對於一個指向結構'a'和成員'b'的指針,表達式'a-> b'等於'(* a).b'。 ***另外***' - >'運算符在C語言(它來自何處)早期意味着其他內容。閱讀例如[這個老答案](http://stackoverflow.com/a/13366168/440558)瞭解更多詳情。 –

+0

http://stackoverflow.com/a/6586248/6543574在這裏解釋,希望幫助:) – Lanfear

+2

'a * b' _never_意味着'a'是指向'b'的指針。最接近的含義是,作爲聲明的一部分,它意味着'b'是指向'a'的指針(其中'a'是_type_)。在表達式中,'a * b'調用乘法。我的歉意是 – davmac

回答

2

a*b通常表示「乘以ab」。 C++只有很少的詞彙元素,其中很多都有很多不同的用途,所以上下文很重要。

a->b是成員訪問權並對應於(*a).b,即訪問由a指向的值的b成員。

請注意,*->運算符都可能被重載。

+0

我打算讓它成爲* b,例如int a * b –

+0

你的意思是'int a,* b;'? –

+0

@AhmedDhia:C++是空白不敏感的。 –

1

對我來說,你似乎對指針的功能和*所屬的位置感到困惑。
指針是一種特殊類型的對象,指向另一個對象,而不是一個對象。
指針可以聲明如下:

int *a; 

這裏,*指定a是一個指針。指針類型與它們指向的對象的類型是不同的類型。
a指的是不確定的。您需要指定地址以使a指向某個東西。

int b = 2; 

而讓ab

a = &b; 

這裏,一元&運算符用於採取b的要做到這一點,讓我們做一個整數(這裏值2初始化) 地址。然後將其分配給a,然後a指向b
當然,指針也可以初始化。上面的語句可以更換:

int b = 2; 
int *a = &b; 

那麼,你如何讓b的從a價值?你可以做到這一點的提領a

std::cout << *a << std::endl; 

這將打印2。一元運算符*在此處用於解除引用a。這*是不同於*以上聲明a並不應該混淆。

++*a; 

這增加了bb現在的值爲3
可以通過分配另一個地址使a指向一個不同的對象:

int c = 3; 
a = &c; 

現在ac,而不是b
您可以將指針,這將指向同一個對象複製:

int *d = a; 

現在dc,這a也指出。

參考是從不同的指針:

int &e = b; 

&在這裏用來指定e是一個參考。這&是不同於&用於採取地址,不應該混淆。這裏,e是指b
他們一個對象,就好像它們是該對象總是行動:

++e; 

這增加bb現在的值爲4
不同於指針引用必須總是指一個對象:

int &f; // error 

的參考還可以指一個指針:

int *&g = a; 

ga
但指針不能指向一個參考:

int &*h = &e; // error 
+0

非常感謝:)這清楚地表明瞭一個問題,但是,我如何防止打印內存地址或指針位置的輸出? –

+0

你不應該給內存地址輸出流。遵循上面的例子,'std :: cout << d << std :: endl'將輸出'c'的地址。 –