賴玲
摘 要:通過對(duì)指針中3組容易混淆的概念研究,介紹了它們的辨識(shí)方法,以具體實(shí)例為依據(jù),介紹了對(duì)數(shù)據(jù)加工和處理的方法,有助于夯實(shí)編程基礎(chǔ),促進(jìn)編程能力的提高.
關(guān)鍵詞:指針;地址;數(shù)組;函數(shù)
中圖分類號(hào):TP312? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):1673-260X(2020)03-0022-03
指針是C語言中的一個(gè)重要概念,是其最具特色的部分,是C語言的精華,同時(shí)也是C語言的難點(diǎn).指針除了能動(dòng)態(tài)地分配地址,表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在調(diào)用函數(shù)的時(shí)候能夠得到1個(gè)以上的結(jié)果外,在系統(tǒng)軟件的設(shè)計(jì)也是非常重要的.筆者在實(shí)際的教學(xué)和學(xué)生的實(shí)際編程指導(dǎo)中發(fā)現(xiàn),很多學(xué)生對(duì)“指針變量的定義符”和“指針變量的取值運(yùn)算符”“指針函數(shù)”和“函數(shù)指針”“指針數(shù)組與數(shù)組指針”等概念混淆不清;認(rèn)真辨識(shí)有關(guān)概念,礪清它們間的相互關(guān)系,對(duì)于編制簡(jiǎn)潔、緊湊、高效的應(yīng)用程序非常有用,下面談?wù)剳?yīng)該辨識(shí)的幾個(gè)概念.
1 “指針變量的定義符”和“指針變量的取值運(yùn)算符”
操作符“*”既可以用來作為指針變量的定義符,也可以用作指針變量的取值運(yùn)算符.要根據(jù)“*”操作符出現(xiàn)的位置進(jìn)行判斷.
例1 int i=3, *p;
p=&i;
printf("%d",*p);
scanf("%d",p);
*p=5;
程序的第一句“int i=3;*p;”定義了一個(gè)整型變量i和一個(gè)整型的指針變量p,i里面只能存放整型變量的值,p(這里P前面的操作符“*”就是指針變量的定義符)里面只能存放整型變量的地址,i的初始值為3,執(zhí)行“p=&i;”中的“&”是取地址操作符,“p=&i;”將i的地址存到指針變量p的空間里面,也可以理解為將指針變量p指向整型變量i的首地址,見圖1所示.
程序中的第三句,以十進(jìn)制整數(shù)的形式輸出*p,對(duì)于*p理解十分重要,這里p前面的操作符“*”就是取值運(yùn)算符,就是p當(dāng)前所指向變量i的存儲(chǔ)空間里面存放的內(nèi)容3.第四句是向指針變量p所指向的空間輸入十進(jìn)制整型數(shù)據(jù),等價(jià)于scanf("%d",&a),第五句是用5覆蓋指針變量p所指存儲(chǔ)空間里面的內(nèi)容,等價(jià)于“i=5;”,因?yàn)閜是指向整型變量i的首地址,“*p=5;”就是將p當(dāng)前所指向變量i的存儲(chǔ)空間里面的內(nèi)容修改為5,這是間接尋址方式.
這里辨識(shí)的原則:一級(jí)指針變量中存放目標(biāo)變量的地址,凡是在聲明的語句中出現(xiàn)的操作符“*”是指針變量定義符,如例1程序第1行中的操作符“*”;在操作和控制部分出現(xiàn)的操作符“*”就是取值運(yùn)算符,如例1程序第3行和第5行中的操作符“*”.
對(duì)于取值的理解一定要注意取值的內(nèi)容,對(duì)于一級(jí)指針,取得內(nèi)容為“指針?biāo)赶虼鎯?chǔ)空間里面的內(nèi)容”即存儲(chǔ)空間的值,對(duì)于二級(jí)指針或者多級(jí)指針有“取存儲(chǔ)空間的地址”和“取存儲(chǔ)空間里面的內(nèi)容”的區(qū)別.
例2 int a,*p,**pp;
a=22;
p=&a;
pp=&p;
printf("%p,%d",*pp, **pp);
假設(shè)變量a的地址為4000,指針p的地址為4100,二級(jí)指針pp的地址為4800,a、p、pp三者的關(guān)系如圖2所示.
由圖2可以看出,a的地址為4000,保存在指針變量p中,p指向a,p的地址為4100,保存在pp中,即二級(jí)指針pp指向指針變量p,此時(shí),要引用a的值,可以使用*p,也可以使用**pp.注意:雖然p、pp都是指針變量,但p和pp指向的內(nèi)容有著本質(zhì)上的不同,p指向的是普通變量的地址,pp只能指向指針變量的地址而不能指向普通變量的地址.
也就是說,二級(jí)指針的指針變量中存放的是一級(jí)指針變量的地址,對(duì)于指針變量的定義符和一級(jí)指針一樣,只要是在聲明語句中出現(xiàn)的操作符“*”都是指針變量的定義符,例2中第1行中的操作符“*”和操作符“**”都是指針變量的定義符,第5行“printf("%p,%d",*pp,**pp);”中“*pp”的“*”和“**pp”前面的“*”是指針變量取值運(yùn)算符,只不過它們?nèi)≈档膬?nèi)容不一樣,“*pp”取的是目標(biāo)對(duì)象的地址,“**pp”也就是“*(*pp)”,取的是目標(biāo)對(duì)象的內(nèi)容.
2 “指針數(shù)組”與“數(shù)組指針”
2.1 “指針數(shù)組”
對(duì)于給定的一個(gè)數(shù)組,其元素都是存放同一類型數(shù)據(jù)的地址,這樣的數(shù)組稱為“指針數(shù)組”. “指針數(shù)組”其本質(zhì)為數(shù)組,只不過數(shù)組元素是同一類型數(shù)據(jù)的地址.例如:
int *p[4];
這里定義了一個(gè)指針數(shù)組,該數(shù)組的每個(gè)元素是整形變量的地址.對(duì)于“*p[4]”可以這樣理解,由于“[ ]”操作符比“*”操作符的優(yōu)先級(jí)高,因此p先與操作符“[ ]”結(jié)合,形成p[4]形式,這顯然是數(shù)組的形式,表示p數(shù)組里面有4個(gè)元素,p[4]中的p再與前面的操作符“*”結(jié)合,“*”是指針類型定義符,表示此數(shù)組是個(gè)指針類型,每個(gè)數(shù)組元素都可以指向一個(gè)整型變量.*p[i]相當(dāng)于*(p[i]),都表示下標(biāo)為i元素的地址,因?yàn)椴僮鞣癧 ]”優(yōu)先級(jí)高于操作符“*”.
注意:這里提到的優(yōu)先級(jí),操作符“()”高于操作符“[ ]”高于操作符“*”.
2.2 “數(shù)組指針”
“數(shù)組指針”也稱為行指針,是指向數(shù)組地址的指針,其本質(zhì)為指針.其定義形式為:
(*指針變量名)[長(zhǎng)度]
例如:int (*P)[n]
這里操作符“()”的優(yōu)先級(jí)比操作符“[ ]”優(yōu)先級(jí)高,“(*P)”表示是個(gè)指針,再與操作符“[ ]”結(jié)合,表示“數(shù)組指針”,“長(zhǎng)度”表示二維數(shù)組分解為多個(gè)一維數(shù)組時(shí),一維數(shù)組的長(zhǎng)度,也就是二維數(shù)組的列數(shù).
例3
main()
{int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *q,(*p)[4];