賴玲


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