2009-11-11 65 views
3

首先,我爲我可憐的英語感到抱歉,這不是我的第一語言。設置地址並初始化指針

這是我第一次研究指針,我發現它真的很奇怪。

我正在閱讀的書說* marker表示'pa'表示的變量。

但是當我嘗試並初始化一個指針

int a; 
int *pA =&a; 

(它們在這種情況下使用*pA),然後改變它,

* PA =&一個;

不起作用,和

PA =&一個;

工程。

所以我的查詢是「是否有初始化指針之間的任何區別,只是代??」

+0

歡迎SO。 :) – BobbyShaftoe 2009-11-11 05:22:44

+0

Ty,認爲這個地方真棒,人們善良,聰明。 希望我可以像你們一樣,然後我可以幫助在C領域有需要的人。 – Rhee 2009-11-11 05:26:22

回答

3
int a; 

此堆棧

int* pA = &a; 

這在棧上分配一個int指針並將其值,以指向上分配的整數。 '*'是聲明的一部分。

*pA = &a; 

在這種情況下,'*'是一個運算符,表示「看哪裏pA點」,這是一個int。然後你試圖將int設置爲a的地址,這是不允許的。

pA = &a; 

現在這與第二條語句相同。它將pA的值設置爲指向a。

+0

我也很好奇當我分配一個指針和一個變量。 > int a,* p1; < - 像這樣 它工作!讓我覺得'*'包含在指針中。 – Rhee 2009-11-11 11:29:02

+0

這只是兩個單獨聲明的簡寫。 *仍然是p1的聲明(int *)的一部分。我同意這不完全直觀,你只需要習慣它。在聲明中,*是類型的一部分。作爲一個操作員,它有不同的(但相關的)含義。 – 2009-11-11 14:25:42

0

當您創建一個指向您使用

int *pA;

之後,使用*pA意味着你訪問價值指向指針

當您使用&a時,您使用的是Address-of Operator,它返回存儲變量a(它是一個整數)的數據所存儲的內存位置的地址。

因此,正確的作業是pA = &a,因爲您正在將地址a複製到pA,該地址應該保存內存位置的地址。

*pA代表該內存位置中的值(整數),因此將地址分配給*pA不正確 - 這就是爲什麼正確的語法是pA = &a

0

是的,當你第一次聲明一個指針時,你可以指定內存地址。因爲您將它聲明爲指針,所以您使用*運算符。但在其他地方,*pA意味着採用該指針引用的值(而不是實際地址)。這有點奇怪,但你已經習慣了。因爲,說,「讓

*pA = &a; 

所以,你可以這樣做:

int a; 
int *pA = &a; 

,你可以這樣做:

pA = &a; 

但你不能做由pA =指向值的值。「

但是,你可以這樣做:

*pA = a; 

這就是你是如何設置的值通過pA的指向。希望這有點清楚。

0

在C,「宣言模仿使用」

在聲明指針int

int *pa; 

你可以看到,paint **paint

您可以將指針指向int到pa,或者您可以將int指定爲*pa
這就是爲什麼在上面的聲明之後,下面的語句「工作」。

*pa = 42; 
pa = &a; 

在聲明本身中,可以通過提供初始化值將其「轉換」爲定義。該定義適用於int*類型的對象pa,而不是*pa

int *pa = &a; /* initialize pa, which takes a `int*` */ 
pa = &b;  /* change `pa` with a different `int*` */ 
*pa = 42;  /* change the value pointed to by `pa` */