c語言之指針初步——從變量的角度看指針

注:
此文是筆者思考的結果,不代表官方解釋,如果有所紕漏或者謬誤,敬請指出。
為區別指針變量與一般的變量,筆者把指針變量稱為指針,而一般的變量稱為變量


首先,筆者以指針與變量聲明的不同之處做本文的引子。

指針與變量聲明有何不同?

眾所周知,在我們聲明一個變量的時候,系統在執行這個程序時會為這個變量分配一個地址以及一個隨機值。

比如:

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的值到底是地址還是數字。於是,我必須想一種方法,把地址與數字區分開來,在指針聲明的時候在指針的前方加上間接尋址運算符,因為是定義指針的運算符,所以叫指針運算符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章