從計算機角度理解C語言指標(二)

2021-10-01 09:22:39 字數 2041 閱讀 5267

這一篇博文我們給記憶體分一下區。有同學會說,聽說過給硬碟分割槽的沒聽過給記憶體分割槽的。其實,學習過linux核心的同學肯定看到過有關頁表的內容。這些講起來太複雜還有什麼虛擬記憶體等等內容更是無法理解,但是這些都不影響我們給記憶體分割槽。

話說記憶體也不是什麼神秘的東西,我感覺它就跟我們小學用的方格本差不多。唯一的區別就是我們這個方格本每一行都有32個格仔,每個格仔裡只能放0或1。

於是我們的程式就將這個叫記憶體的方格本分成了以下幾個部分:

1.程式**區:這個區裡面主要存放程式指令。

2.棧區:這個區主要存放函式引數。

3.堆區:這個區提供給程式猿自由使用,想怎麼用就怎麼用。不過用完了要還回來。

4.靜態儲存區:這個區主要儲存程式的全域性變數。

給記憶體分完區之後呢,我們來說說c語言的指標和記憶體的前世今生。

我們都學過,指標就是位址。那是誰的位址呢?我們家的位址嗎?還是硬碟的位址?這個位址有什麼用呢?等等,一系列的問題應用而生。我想你已經猜到啦,對,指標就是記憶體的位址。它指示了我們標定的記憶體儲存空間在方格本的第幾行。為了方便編址,記憶體把方格本的第一頁的第一行的第乙個格編號為0直到最後一頁的最後一行的最後乙個格依次遞加。下面我們將由淺入深逐步給出指標使用的各種方法,進一步深入理解指標和記憶體。

1.變數、指標和指標變數

int

main()

上面的**段定義了3個變數和使用了兩種符號。這兩種符號分別是*和&,要想正確的理解指標,正確的理解這兩個符號的使用是重點。所以我們要牢記一下三點:

(1)運算子星在定義變數時在變數名前面使用表示定義的變數是個指標。

(2)運算子星在給變數賦值時在變數名前面使用表示取出指標所指的內容。

(3)運算子&表示取變數指標。

執行上面的**會輸出以下結果:

a1 =

4a2 =

5a3 =

6

我們在我們的腦海中描繪一下變數a、p和pp在記憶體中是什麼樣子的就很容易理解上面的**段同時輸出這樣的結果也顯而易見。這裡的三個變數我們一般有以下名字:

a:int型變數它在記憶體中的位址為&a。

*p:取出指標p所指的int型變數。

*pp:取出pp指標所指的int型指標變數。

**pp:取出pp指標所指的int型指標所指的int型變數。

到此我希望讀者可以執行下面的程式,我將利用程式歷程逐步描繪出變數在記憶體中的形態。

int

main()

執行結果為:

&a=

809374548

,&p=

809374552

,&pp=

809374560

p=809374548

, pp=

809374552

,*pp=

809374548

每次執行顯示的數值不同,但是我們會發現以下關係

*pp = p =

&a;pp =

&p結合上乙個執行結果還有

**pp =

*p = a

我們可以畫出下面的記憶體圖:

變數名大小(byte)位址值

a48093745485p

4809374552

809374548pp4

809374560

809374552

結合程式執行結果和上面的圖表,我們會很容易理解以下四條賦值語句:

p =

&a;*p =5;

pp =

&p;*

*pp =

6;

讀者需要好好理解上面的幾個例子,對理解指標有很大的好處。我的這篇文章c語言實現字串split是字元指標、字串和字串指標陣列很好的例子感興趣的讀者可以參考。

快取(一) 從計算機角度理解快取

粗略講一下,計算機是由多個元件構成,最重要的3點,cpu,記憶體,外存,本文重點講記憶體和外存 記憶體是計算機中重要的部件之一,它是與cpu進行溝通的橋梁。計算機中所有程式的執行都是在記憶體中進行的,因此記憶體的效能對計算機的影響非常大。記憶體 memory 也被稱為記憶體儲器,其作用是用於暫時存放...

c語言之指標初步 從變數的角度看指標

注 此文是筆者思考的結果,不代表官方解釋,如果有所紕漏或者謬誤,敬請指出。為區別指標變數與一般的變數,筆者把指標變數稱為指標,而一般的變數稱為變數 首先,筆者以指標與變數宣告的不同之處做本文的引子。眾所周知,在我們宣告乙個變數的時候,系統在執行這個程式時會為這個變數分配乙個位址以及乙個隨機值。比如 ...

從C 進入計算機語言的世界 1

我是在學校從事軟體開發教學的一名老師,經過3年多的教學,感受頗多,也有很多總結。故製作本教程,分享我的個人經驗,希望初學者能從中得到啟發,也希望高手指點迷津。暫定名稱為 從c 進入計算機語言的世界 本篇是最基礎的內容,講述了軟體的概念。1.1.軟體的定義 1.1.1.軟體的定義 計算機軟體 soft...