2017-06-15 132 views
-3
int main(int argc, char *argv[]) 
{ 
    int *p=5,**P; 
    printf("%d",&P); 
} 

* p和** P有什麼區別?這兩個指針有什麼區別?

+0

你用'p'小寫和'P'大寫?是的,這是可讀的,不會令人困惑... – bolov

+0

如果你想聲明一個指向一個int值爲5的變量,你應該寫'int x = 5; int * px =&x;'。然後,您可以使用正確的格式說明符printf(「%p」,px);'來打印該內存地址。 –

+0

對於'int * p = 5',你聲明一個類型爲'int *'的變量'p'(或者指向int的指針),並且爲p賦予內存地址'5',不管它包含什麼(可能不是int)一個int值爲5的變量的地址。這是一個[bad idea](https://ideone.com/2H0adX)。 –

回答

1

* p是指向一個int等於5

** P是一個指向指針的指針,它是一個包含一個地址的變量。

指針是一個包含地址的變量。在你的電腦中,每個變量都存儲在內存中的某個地方。變量放置的確切位置稱爲變量地址。

用指針可以知道另一個變量的確切地址。

int c = 5; // this value of this int is stored at a certain address; 
int *p = &c; // the pointer p now contains the address where 5 

請記住,* P是可變太,因此在某處存儲在存儲器中爲好。

int **P = &p ; // a double pointer that contains the address of the pointer p 

這將是一個新的指針,指向存儲p的地址(不是變量c!) - 一個指針;

+0

你能告訴我什麼是指向一個指針嗎?...它是一個地址的新地址 –

+0

感謝您的提示! 剛剛編輯我的答案;) – Eduard6421

0

單個星號代表一個指針,而雙星號代表一個指向指針的指針。

0

* p是int的地址,等於5.所以在內存的某個地方,有一個int等於5,那個指針指向那個int的那個地址。

** p是內存中指針的地址。所以想想看,我們有一個指向上面int的指針,但現在最重要的是,我們有另一個指針指向int的指針。另一種考慮它的方法是我們有一個用於int的另一個地址的地址。

+0

好的謝謝.....所以如果我們有指針** A和A = 5,那麼我們必須寫&A來獲得該值? –

+0

實際上,當我們在變量前面使用&時,這隻會給我們地址。爲了取消引用指針,我們必須使用*仍然這樣做,但是一旦這樣做仍然會給我們指針(地址)。我們將不得不再次解除引用,但這不是我們如何使用雙指針。 通常情況下,我們使用雙指針將正則指針傳遞給函數,所以我們保留真指針,因爲否則就會複製它。這使我們能夠使用該指針而不會丟失原始指針。我會在一秒內發佈一個鏈接以顯示我的意思。 –

+1

好吧,這有一個簡單的方法來解釋雙指針及其用法:[link](https://stackoverflow.com/questions/5580761/why-use-double-pointer-or-why-use-pointers-to-pointers ) –