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