2017-10-28 164 views
8

我新手上C.我需要了解每個印刷在屏幕上的值的裝置通過以下代碼:C指針的「**&ptr」和「2 ** ptr」是什麼意思?

#include<stdio.h> 

int main() 
{ 
    int x = 10; 
    int *ptr = &x; 
    printf("%d %d %d\n", *ptr,**&ptr, 2**ptr); 
    return 0; 
} 

輸出(GCC):

10 10 20 

這裏,我已聲明變量xptr指向x變量。所以,*ptr的印刷值爲x。但我無法理解**&ptr2**ptr的值。

在此先感謝。

+1

第一個10是ptr的內容(而ptr是x的adr)所以它是x的內容......第二個是你得到ptr的adr,* =你得到它的內容,* =你再次得到ptr的內容,這也是x。最後一個將* ptr乘以2和* ptr的內容再次是x的內容 –

+2

如果您瞭解了什麼是* * ptr,那麼您在理解格式時可能會明白'2 * * ptr'是什麼。 (這是'* ptr'的兩倍) – Ryan

+1

您可能會發現這些讀數很有用[什麼是「取消引用」指針?](https://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer - 意思是「引用」和「取消引用」](https://stackoverflow.com/questions/14224831/meaning-of-referencing-and-dereferencing) –

回答

30

這裏,*&運營商相互取消作用時,一個接一個地使用。

**&ptr*ptr相同,這裏ptr保持地址爲x變量。所以,在這裏打印x的值。

2**ptr被解釋爲2 * (*ptr)。所以,2 * (10)等於20

9
**&ptr 

&*是具有與其它的相反的意思1一元運算符。

&(lvalue)表示返回相應的lvalue的地址,而*(lvalue)表示從左值指向的地址返回值,考慮左值的類型,以便知道如何解引用它。

目測這些操作符的含義是這樣的(我在emacsartist-mode人才不是太大):

 +----------------+    
     | ptr = *&ptr |    
     +--------------+-+    
    /    \ 
    /    \ 
    &ptr     \ 
          +----------------+ 
          | *ptr  | 
          +----------------+ 
         /
         /
         ptr 

注意,標誌着我盒內正確的價值,而方框外的地址的相應存儲器位置的左值的存儲器。

現在,當你寫*&(lvalue)時,它意味着從左值的地址獲得值,該值很快寫入lvalue

所以**&ptr裝置*ptr - 即從通過PTR的ADRESS指針的值,解除引用作爲整數,在殼體10


2**ptr 

詞法分析器將在令牌和解析器分裂代碼將建立一個這樣的樹:

(2) * (*ptr) 

在這種情況下,結果將是從ptr的ADRESS 2倍的值,在你的c ase 20

+5

很好的答案,但說實話我找到你的圖很混亂。首先,'ptr'報告兩次,一次在盒子裏,一次在外面。而且在任何地方都沒有'x = 10'。 –

+0

@FabioTurati在盒子裏面它是正確的值,在盒子外面是左邊的值。沒有x = 10的答案是抽象的,而不是具體的。 – alinsoar

0

ptr是一個指針變量。該指針變量將指向存儲x值的內存位置。* ptr將訪問指針變量指向的值。

現在&是C中的一個地址操作符。& ptr返回ptr的地址。 So * & ptr從ptr的地址返回值。所以*和&將相互無效。那是ptr和* & ptr是一樣的。

ptr = *&ptr => *ptr = **&ptr 因此,值是10。

2 **的ptr只不過是2 *(* PTR)。因此,該值爲20.

+0

「*'* ptr'是一個指針變量。*」沒有。 'ptr'是指針可變的。正如你正確地提到的那樣:'* ptr'是解引用指針'ptr'。所以實際上'* ptr'評估爲一個'int'。 – alk

2

int *ptr指向int x。

printf("%d\n", *ptr);表示 - 取值prt分。所以* ptr是x的值。

printf("%d\n", **&ptr); - & ptr是指針的地址,*&ptrptr中的值。並且&ptr的值是x的地址。所以**&ptr是值x

printf("%d\n", 2**ptr); - 2乘以ptr值。它的意思是2 * x

相關問題