關於指標的幾個問題與解答

2021-05-25 01:19:52 字數 2675 閱讀 8011

這幾天一直在理解這幾個概念。

假如我宣告了乙個指標,它占用記憶體不,有沒有位址。如果只宣告,不初始化,值是沒有還是值隨機。普通變數也是。

利用指標在函式之間進行通訊,應該怎樣才能正常通訊。

指標和陣列名、字串名能完全等價嗎?

一、宣告即有位址,指標的位址是什麼型別

如果我宣告了乙個指標,那麼他就是乙個指標變數,是變數總是有位址的。但關鍵分配給這個指標變數的記憶體有多大。假如我宣告了乙個

char *p

變數。那麼

p占有多大的記憶體空間。我的理解是只有

int型大小的空間,非

char

型大小的空間,而且無論你宣告什麼型別的指標變數,指標變數本身的記憶體大小都是

int。而宣告的型別,如

char

只是指這個指標將要指向的變數是乙個

char

型,而非指標變數本身是

char型

通過設計乙個程式即可驗證,如下:

char *p[2];

printf("%p/n",&p[0]);

printf("%p/n",&p[1]);

上述語句是宣告了兩個指標,連續的指標(所以用指標陣列來表示),列印出來的位址為:

0012ff68

0012ff6c

兩個位址相差

4個位元組。

下面一條語句,將

char

型換成double型:

char *p[2];

printf("%p/n",&p[0]);

printf("%p/n",&p[1]);

結果依舊為:

0012ff68

0012ff6c

還是相差

4個位元組,也就是乙個

int型大小。這就充分證明了,指標變數本身只占有

4個位元組的空間。上述結論只適應於本機。其實指標占有多少空間是和計算機系統相關的,在

32位機上就是

4個位元組。

32位機的最大記憶體定址空間為2的

32次方個位,即

4gb。

二、未初始化的變數不可隨便用,除非是用在賦值語句中

但是如果我想在函式之間進行通訊,傳位址,改如何寫?假如寫成

呼叫函式內容

int mian()

被呼叫函式內容

swap(char *p)

這樣的形式是不行的。雖然在呼叫函式中

p是指標變數。但並沒有給

p賦值,

p的內容是隨機的,有可能不指向

char

型別的變數,也就不能將位址傳給

swap

中的char

型指標。所以以這種方式進行傳位址是錯誤的。在宣告指標的時候,系統只分配了指標本身所占用的空間,並沒有給這個指標的內容進行初始化。而指標的內容如果未知,那麼它所指向的位址也就未知,也就達不到你想將乙個變數的位址傳遞給另乙個函式的目的。同樣,如果乙個普通變數只分配了記憶體但沒進行初始化,那麼它的值也是隨機的。也就是說,在進行傳位址之前你首先要確定乙個位址。因此可以有如下兩種改進方式

乙個是:

char *p;

swap(&p)

另乙個是:

char p;

swap(&p)

前一種其實是不可取的,雖然在某些條件下也是行得通,因為

p的位址是整型,而且

p的內容也是整型,雖然它是

char

型別的指標變數,但它只是指向乙個

char

型別的變數,儲存的只是

char

型別變數的位址,而位址是整型。所以如果被呼叫函式傳遞回來的不是整型,那麼將出錯。而第二種是正確的方法。定義了乙個

char

型變數,雖然沒有初始化,也就是

p的值未確定,但是

p的位址是定的,而且傳遞回來的還是

char

型別。

所以,綜上:指標和普通變數在宣告的時候都有位址,未經初始化時值都是隨機的。隨機的值本身並沒有什麼過錯,隨機的值是可以賦值的,但未賦值就不能拿來就用,除非是在賦值語句中用,所以,必須先確定值。上面這個例子就是這個理念的佐證,如果傳了乙個隨機的位址,那麼就是錯誤,但未初始化的變數仍然是可以傳位址的,因為位址是確定的。

三、變數能賦值,常量不可

這個道理非常簡單,不用多解釋。但一定要分清什麼是變數,什麼是常量。

乙個指標變數和陣列名可以等價嗎?

不可以,雖然他們都代表位址。

但指標是變數(沒有用

const

限制),陣列名是常量。這也解釋了為什麼可以將乙個值賦給指標變數,但不可以將整個陣列的值賦給乙個陣列名。

綜上這個幾個例子,確定一些基本觀念。

宣告即有位址。指標變數位址是不隨其型別改變的,都是

int型。

未初始化的變數內容是隨機的,在引用之前一定要確定內容,除非是給其賦值。

變數能賦值,常量不可。

這幾點雖然都是最基礎的,但是具體到應用的時候根本就拋之腦後,規則不複雜,但由幾個簡單規則引申出來的應用就會讓人眼花繚亂了,回歸最根本的規則才是正道。

關於指標和記憶體的幾個問題

一 delete p 會刪去 p 指標,還是它指到的資料,p 該指標指到的資料。delete 真正的意思是 刪去指標指到的東西 delete the thing pointed to by 同樣的英文誤用也發生在 c 語言的 釋放 指標所指向的記憶體 free p 真正的意思是 free the s...

關於指標和記憶體的幾個問題

一 delete p 會刪去 p 指標,還是它指到的資料,p 該指標指到的資料。delete 真正的意思是 刪去指標指到的東西 delete the thing pointed to by 同樣的英文誤用也發生在 c 語言的 釋放 指標所指向的記憶體 free p 真正的意思是 free the s...

關於指標和記憶體的幾個問題

一 delete p 會刪去 p 指標,還是它指到的資料,p 該指標指到的資料。delete 真正的意思是 刪去指標指到的東西 delete the thing pointed to by 同樣的英文誤用也發生在 c 語言的 釋放 指標所指向的記憶體 free p 真正的意思是 free the s...