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

2021-09-11 14:25:40 字數 1666 閱讀 5759

注:

此文是筆者思考的結果,不代表官方解釋,如果有所紕漏或者謬誤,敬請指出。

為區別指標變數與一般的變數,筆者把指標變數稱為指標,而一般的變數稱為變數

首先,筆者以指標與變數宣告的不同之處做本文的引子。

眾所周知,在我們宣告乙個變數的時候,系統在執行這個程式時會為這個變數分配乙個位址以及乙個隨機值。

比如:

int a;

//宣告乙個整型變數,變數名是a,位址是&a,值隨機(記為a = random)

而指標的宣告其實也與變數宣告類似:

比如:

int

* a;

//宣告乙個整型指標,指標名是a,位址是&a,值隨機(記為a = &random)

綜上,我們不難發現,指標的宣告與變數的宣告的區別是指標的值是位址,變數的值就真的是值。這就好比指標記錄的是門牌號,而變數記錄的是戶主一般。

為支援下文的理論,有必要講述一下「 * 」是什麼。

「 * 」是指標運算子,又稱間接定址運算子解引用運算子,其作用是提取指標指向的變數的值。

筆者習慣稱之為「間接定址運算子」,這個符號的功能也與其字面上的意思最為匹配。

功能具體以下程式碼展現:

int

* a;

//宣告乙個指標a,位址是&a,&a上儲存著a指向物件的位址,此時a未初始化,

//即a = &random

a =&b;

//把b的位址賦值給a

*a = b;

//再對a進行間接定址操作,(通過找到a上儲存的位址&b,提取這個位址),

//通過a找到&a,在&a上儲存著&b,從而找到&b上儲存的值。這是乙個間接定址的過程

知道了指標與變數宣告的差別以及間接定址運算子之後,下面我們進入正題。

筆者從正向上思考,來模擬語言開發者的在指定語法的想法。

現在我想用變數a儲存另外乙個變數b的位址,以便於從根本上訪問並更改b的值。

1,首先我想先獲取b的位址,這並不難。

int a;

//宣告乙個整型變數,變數名是a,位址是&a,值隨機(記為a = random)

int b;

//宣告乙個整型變數,變數名是b,位址是&b,值隨機(記為b = random)

a =&b;//把b的位址賦值給a

2,現在變數a已經獲得了b的位址,為了順利更改b的值,在獲取b的位址之後我要獲取b的值,於是我定義了「 * 」,「 * 」和「 a 」組合,便可以獲得b的值。

*a = b;

//「*」就像把a上儲存的b的位址解釋了一般,所以又叫解引用運算子

3,既然已經獲取了b的位址,並且也表現出了b的值,現在重新賦值便可以順利更改b的值了。

*a =

520;

//等效於b = 520;

4,方法似乎已經很完美了,但是不要忘了,位址是以16進製制數的形式儲存的,如果僅僅按照第一步的方法賦值,計算機將無法判斷賦值給a的值到底是位址還是數字。於是,我必須想一種方法,把位址與數字區分開來,在指標宣告的時候在指標的前方加上間接定址運算子,因為是定義指標的運算子,所以叫指標運算子。

C語言 之 指標初步理解

c語言之指標 指標是c語言的靈魂所在,也為程式設計師提供了一種訪問變數位址的方式。那啥是指標?指標就是變數的位址,說白了就是這個變數儲存在哪個位置,你可以通過指標檢視,所以學習指標記住一句話 指標就是位址。例如 int number int pointer a 這是一種把變數位址賦給指標的方法 第二...

從彙編的角度看C 裡的引用和指標

c 裡有引用和指標,使用過c 的應該都知道它們的異同點。本文將從彙編的角度去觀察這2者的本質。使用也非常簡單,在左側編寫c 在右側就會直接顯示對應的組合語言,也可以根據需要的平台來選擇對應的編譯器 我們使用的c 如下,比較簡單 int main void 選擇的編譯器是x86 64 gcc 9.2,...

C語言從記憶體上看指標

從下圖知道指標也是有位址的 在來看指標與變數的的記憶體塊 紅線是指標的位址 藍線是指標指向變數的位址ps 我把變數賦了初值 從上圖可以看出指標的位址裡面的值為 00 fe 6f 00 h x86的指標大小是4 因為大小端問題要從高位址向下 所以指標的值應該是 00 6f fe 00 h 而指標位址裡...