時(shí)間:2019-08-09 13:06:02 作者:johnnyl 瀏覽量:41
什么是 C言語(yǔ)指針?
圖一 怎樣了解C言語(yǔ)中的指針,怎樣運(yùn)用
不同的數(shù)據(jù)類型的主要差異在于占用的存儲(chǔ)空間不同。咱們知道,C 程序是運(yùn)轉(zhuǎn)在計(jì)算機(jī)的內(nèi)存中的,因而 C 程序的變量也是存在于內(nèi)存中的。C 標(biāo)準(zhǔn)規(guī)則 char 類型占用一個(gè)字節(jié)的存儲(chǔ)空間,對(duì)其他整型卻沒有做規(guī)則,現(xiàn)在為了解說的便利,咱們假定 int 類型的數(shù)據(jù)占用內(nèi)存 4 個(gè)字節(jié)。
假定咱們?nèi)缦陆缯f了兩個(gè)變量:
signed char i = 3;int j = 8;
那么,i 占用了 1 字節(jié)的內(nèi)存空間,j 占用了 4 字節(jié)的內(nèi)存空間,方框表示內(nèi)存空間,內(nèi)部表示存儲(chǔ)的值。咱們把內(nèi)存逐字節(jié)編號(hào),方框外部的數(shù)字表示方框的編號(hào)(這樣的內(nèi)存“編號(hào)”即所謂的“內(nèi)存地址”)。修正變量 i 的值,實(shí)際上便是修正地址為 4000 的內(nèi)存空間里的值。那反過來呢?假如我修正了地址為 4000 的內(nèi)存空間里的值,i 的值會(huì)相應(yīng)改變嗎?答案是肯定的,請(qǐng)持續(xù)往下看,內(nèi)存地址“4000”是我為了解說便利隨意取的。那么,在實(shí)際應(yīng)用中,變量 i 的地址怎樣獲取呢?C 言語(yǔ)供給了“&”運(yùn)算符,便是獲取變量地址的。請(qǐng)看下面的例子:
#include
int main()
{
signed char i = 3;
int j = 8;
long p1 = (long)&i;
printf(\\\"p1: %ld \\\",p1);
return 0;
}
咱們?nèi)〕隽?i 的地址,把它強(qiáng)制轉(zhuǎn)換為 long 型(關(guān)于強(qiáng)制類型轉(zhuǎn)換,可參閱上一節(jié)),傳遞給 p1 了。編譯履行,發(fā)現(xiàn)變量 i 的地址被打印出來了。這說明,C 程序變量的地址也是一個(gè)整數(shù)。
依照上面的說法,修正 i 的值除了直接對(duì) i 賦值以外,還能夠經(jīng)過修正 p1 地址處的內(nèi)存空間里的數(shù)值。那,怎樣才能“經(jīng)過修正 p1 地址處的內(nèi)存空間里的數(shù)值”修正 i 的值呢?
上面的代碼實(shí)例中,咱們運(yùn)用了 long 型變量 p1 存儲(chǔ)了 i 的地址。事實(shí)上,C 言語(yǔ)有專門的數(shù)據(jù)類型存儲(chǔ)地址,界說方式也很簡(jiǎn)單,便是:“類型描述符 * ”,例如,能夠界說以下變量存儲(chǔ)地址:
signed char *p1 = &i;int *p2 = &j;
p1 和 p2 便是 C 言語(yǔ)中所謂的指針類型,由于 i 是 signed char 類型的,所以界說了 signed char * 類型的指針存儲(chǔ) i 的地址。j 是 int 類型的,所以界說了 int * 類型的指針存儲(chǔ) j 的地址。別的,C 言語(yǔ)供給了“&”運(yùn)算符取變量地址,與之對(duì)應(yīng)的,還供給了“ * ”運(yùn)算符從相應(yīng)地址內(nèi)存里取出數(shù)值。
好了,了解了 C 言語(yǔ)的指針類型和“ * ”運(yùn)算符,現(xiàn)在來看看怎樣“經(jīng)過修正 p1 地址處的內(nèi)存空間里的數(shù)值”修正 i 的值。請(qǐng)看如下代碼:
signed char *p1 = &i;
*p1 = 5;
printf(\\\"i=%d \\\",i);
編譯運(yùn)轉(zhuǎn),發(fā)現(xiàn)程序輸出“i=5”,這樣咱們就完成了“經(jīng)過修正 p1 地址處的內(nèi)存空間里的數(shù)值”修正 i 的值。
在界說變量時(shí),” * “放在變量符號(hào)前,能夠界說指針變量。在界說完指針變量后,“ * ”放在變量前,就表示從地址取值的運(yùn)算符了。別的,“ * ”還能夠表示乘法運(yùn)算符,讀者自己思考什么情況下,“ * ”表示乘法運(yùn)算符。
以上的操作,實(shí)際上便是 C 言語(yǔ)的指針操作,能夠看出它一點(diǎn)也不奧秘,接下來幾節(jié),咱們將持續(xù)討論 C 言語(yǔ)的指針,比方為什么 int 類型的變量 j 的地址要運(yùn)用 int* p2; 界說,而不能運(yùn)用 signed char* p2; 界說,運(yùn)用指針為何能寫出緊湊、高效的 C 程序等等。
為什么要運(yùn)用指針?
在開始討論為什么運(yùn)用 C 言語(yǔ)指針之前,先介紹一下復(fù)雜點(diǎn)的指針,這是新知識(shí),也是襯托。不想看襯托能夠往后翻一翻。
前面幾節(jié)介紹了 C 言語(yǔ)中指針,也討論了數(shù)組指針和指針數(shù)組的差異,但歸根結(jié)底,至今咱們說的都是根底數(shù)據(jù)類型界說的指針,C 言語(yǔ)有復(fù)合數(shù)據(jù)類型,那么它有復(fù)合數(shù)據(jù)類型的指針嗎?答案是肯定的,事實(shí)上,在 C 言語(yǔ)中復(fù)合類型指針的運(yùn)用相當(dāng)廣泛。