這幾天一直在理解這幾個概念。
假如我宣告了乙個指標,它占用記憶體不,有沒有位址。如果只宣告,不初始化,值是沒有還是值隨機。普通變數也是。
利用指標在函式之間進行通訊,應該怎樣才能正常通訊。
指標和陣列名、字串名能完全等價嗎?
一、宣告即有位址,指標的位址是什麼型別
如果我宣告了乙個指標,那麼他就是乙個指標變數,是變數總是有位址的。但關鍵分配給這個指標變數的記憶體有多大。假如我宣告了乙個
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...