注:
此文是筆者思考的結果,不代表官方解釋,如果有所紕漏或者謬誤,敬請指出。
為區別指針變量與一般的變量,筆者把指針變量稱為指針,而一般的變量稱為變量
首先,筆者以指針與變量聲明的不同之處做本文的引子。
指針與變量聲明有何不同?
眾所周知,在我們聲明一個變量的時候,系統在執行這個程序時會為這個變量分配一個地址以及一個隨機值。
比如:
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的值到底是地址還是數字。於是,我必須想一種方法,把地址與數字區分開來,在指針聲明的時候在指針的前方加上間接尋址運算符,因為是定義指針的運算符,所以叫指針運算符。