2011-12-30 58 views
1
int x = 4; 
    int* q = &x;     // Is it always equivalent to int *q = &x; ? 
    cout << "q = " << q << endl; // output: q = 0xbfdded70 
    int i = *q;     // A 
    int j = *(int*)q;   // B, when is this necessary? 
    cout << "i = " << i << endl; // output: i = 4 
    cout << "j = " << j << endl; // output: j = 4 

我的問題是A行和B行是什麼,以及爲什麼輸出都是4?指針上的這個操作是如何工作的?

回答

2
int x = 4; 

x爲4

int* q = &x; 

q是x的內存位置(持有4)

cout << "q = " << q << endl; // output: q = 0xbfdded70 

有你的記憶位置。

int i = *q; // A 

i是在存儲器位置q中的值

int j = *(int*)q; // B 

j是在存儲器位置q中的值。 q被轉換爲一個int指針,但這就是它已經是。

+0

是'*(INT *)問;'必要的我在某些情況下?我想不出一個,但想知道是否有這種可能性。 – qazwsx 2011-12-30 16:45:56

+0

'(int *)q'的意思是「不管q是什麼,我想把它當作一個指向int的指針」。當你想要使用數據的位佈局做技巧時,這很有用。而且,C語言中的程序通常會將指針實際指向的內容隱藏起來(通過將其指向(void *))。 – 2011-12-30 17:26:12

+0

所以用最簡單的術語來說,如果'q'已經不是**或'int *','(int *)q'將是必要的。 – 2011-12-30 17:30:02

1
int i = *q; // A 

取消引用指針,以獲得尖銳的價值

int j = *(int*)q; // B 

類型轉換指針的int *,然後解引用它。

兩者都是相同的,因爲指針已經指向一個int。所以在第二種情況下類型轉換爲int *根本不需要。

在這兩種情況下,進一步去除均會產生指向的整型變量值。

1

A和B行是相等的,因爲q已經是int *,因此(int *)q等於q。 int i = * q; yelds,我變成了由q指向的整數的值。如果你想讓我等同於地址本身,請刪除星號。

1

答:Dereference - 需要一個指針的值(變量或對象),並返回值

B:投射到int*和比解引用

結果是相同的,因爲該指針是已經到INT。而已。

+0

+1指出費米實驗室的沒有廢話的參考手冊 – qazwsx 2011-12-30 16:48:25

0

A行取q指向的值並將其指定給i。 b行將q轉換爲類型int*(這已經是q的類型,因此轉換完全是冗餘的/無意義的),然後將q指向的值賦給j

兩者都給你4,因爲這是q指向的值。

0

行A去引用指針q鍵入爲int *,即指針指向的值爲int

B行轉換q as (int *)解除引用前,所以B行與int j = *q;相同。

3

它是指針的基本用法,所述的取消引用指針(訪問變量到其中指示器分)「:

int i = *q; // A 

而B是做完全一樣,但它另外蒙上指針同類型你可以寫這樣的:。

int j = *q; // B 

沒有必要爲(int *)