c語言的變數和指標,怎麼理解?

時間 2021-07-04 19:49:39

1樓:zhonyong

自問自答 :)

c語言的變數,比如如果有下面的語句

char c = 'a';

這裡定義了char型別的變數c,分配了乙個位元組的儲存空間,並且賦初值為'a'。

再來看:

int a;

這條語句定義了乙個沒有賦初值的int型變數a,在32位cpu上,即是分配了4個位元組的儲存空間。因為沒有賦初值,所以4個位元組的儲存空間內容保持之前的不變,。也可以說成是隨機的,不確定的。

下面再來看看指標變數:

int *p;

這條語句我們都知道是定義了乙個指標變數p,型別是int*。在32位cpu系統,分配了4個位元組的儲存空間,因為沒有賦初值,所以4個位元組的內容保持之前的值不變。

是不是和前面int a有點點像。除了型別不同,事實上還真是乙個樣的。

那下面的語句是什麼意思,是否可行呢?

a = 1;

p = 1;

兩個語句都是賦值為1, 下面細分一下:

a = 1; 等號左右兩邊的都是int型別,符合c語言的語法。執行之後就是把a的儲存空間的4個位元組的內容改為1。

p = 1; 等號左邊是int *型別,右邊是int型別。不符合c語言的語法規則,編譯器會報錯。修改的辦法也很簡單,型別強轉。

p = (int*)1; 即是先把int型別的1強轉為int*型別的1。執行之後就是把p的儲存空間的4個位元組的內容修改為1。

最後儲存空間的內容都是1,但是意義不同。a的值1,就是int型的數字1,而p的值1,卻是int*型的1, 換個說法就是,位址1。

是的,就是位址1. 連續的記憶體空間從0開始編址,位址1就是從第二個位元組的位址。但是p指向的是乙個位元組嗎?

這個問題就要回到p的型別int *,即p是指向int型的指標變數。所以答案p指向的應該是4個位元組的int型變數。

結論很簡單:

1)變數會根據型別而分配到對應長度的儲存空間;

2)儲存空間的值就是變數的值。

3)上面兩條也適用於指標變數,不同的是指標變數的值是乙個位址,而位址對應的型別就是定義指標的型別,也可以說是指標變數解引用後的型別,就是*p的型別。

c語言中指標指向的非指標變數不能使用 或 嗎

大灰灰老師 學術概念上不太正確 關於 unary 的定義 但實際上是對的解釋 C語言中,所有 unary operator 單目運算子,優先順序都是有著 left to right associativity 的比 right to left 的高,即放在被操作量右邊的先算。例如 p 先算右邊的 s...

C語言指標int p 4 如何理解?

Dawson 我是這樣記的。從左到右結合,沒有小括號的話,重點在陣列,因此是指標陣列,每個陣列元素都是指標。有小括號的話,重點就是指標,因此是陣列指標。是乙個指向陣列首位址的指標。 路漫漫其修遠兮 int p 4 p是指標,指向長度為4,元素型別為 int 的陣列 int p 4 p是陣列,長度為4...

C語言的指標是不是像我理解的這樣?

C語言答疑課堂 對C語言指標的理解,一萬個人有一萬種理解法,題主的這個理解也是有道理的。我對C語言指標也有自己的理解,甭管是基本資料型別的指標,還是陣列指標,還是函式指標,還是結構體指標,都離不開兩個字 己他 說白了,我覺得只要理解了C語言指標的 己他 概念,你會發現C語言指標是個紙老虎!指標的 己...