陳景彥 陳岳彬
摘要:可以說(shuō)指針是C語(yǔ)言的靈魂,熟悉而靈活的運(yùn)用指針,可以有效的表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);動(dòng)態(tài)分內(nèi)存;使用字符串;數(shù)組等都是非常有效的。而初學(xué)者經(jīng)常出現(xiàn)錯(cuò)誤,如何讓學(xué)生掌握和深入的學(xué)習(xí)指針是一難點(diǎn),往往需要一定時(shí)間。以下結(jié)合經(jīng)驗(yàn),對(duì)指針問(wèn)題進(jìn)行探討和總結(jié)。
關(guān)鍵詞:指針;C語(yǔ)言;變量
中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)21-5163-03
C Language Pointer in the Teaching of Basic Application
CHEN Jing-yan1,CHEN Yue-bin2
(1.Medical College of Shantou University, Shantou 515041, China; 2.Zengcheng College of South China Normal University, Guangzhou 511363, China)
Abstract:It can be said that the pointer is the soul of the C language, familiar and flexible use of the pointer, you can effectively represent complex data structures; dynamic memory; the use of string; arrays are very effective. Beginners often an error, how to enable students to acquire and in-depth learning pointer is a difficult and often requires some time. The following combination of experience, discuss and summarize the pointer problem.
Key words:pointer;C language;variable
C語(yǔ)言是一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,是目前最廣泛使用的計(jì)算機(jī)語(yǔ)言之一,也是各高校專業(yè)與非專業(yè)主要的計(jì)算機(jī)教學(xué)語(yǔ)言。指針是C語(yǔ)言中最為復(fù)雜的一個(gè)部分,使用起來(lái)非常靈活,因而學(xué)習(xí)時(shí)常出錯(cuò),必須小心,多思考,多比較,在實(shí)踐中把其掌握好。
1指針概念
指針變量簡(jiǎn)稱指針,其實(shí)它也是變量,只不過(guò)里面存放的內(nèi)容是一個(gè)地址,這個(gè)地址指向另外一個(gè)變量。指針就是內(nèi)存的地址,必須弄清楚數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)與讀取的;內(nèi)存單元地址與內(nèi)存單元內(nèi)容是兩個(gè)不同的概念。內(nèi)存單元地址就像賓館每個(gè)房間一樣,其房間號(hào)就是其地址,單元內(nèi)容可以理解為房中的賓客;如圖1所示:假設(shè)程序定義了三個(gè)變量a、b、c,編譯時(shí)系統(tǒng)分配1000和10001兩個(gè)字節(jié)給a,1002和1003給b,1004和1005給c。由此可以知道,地址是用來(lái)標(biāo)識(shí)每一個(gè)存儲(chǔ)單元,是用戶對(duì)存儲(chǔ)單元中的數(shù)據(jù)的訪問(wèn),在C語(yǔ)言中形象的將地址叫做指針,它可以用來(lái)指向變量、數(shù)組、結(jié)構(gòu)體、和多級(jí)指針等等。對(duì)于表達(dá)式、常量或者是寄存器變量則不能用指針來(lái)指向。
2指針變量的定義和引用
2.1指針變量的定義
C語(yǔ)言規(guī)定指針變量在使用之前必須被定義,遵循先定義后使用的原則,定義指針變量與一般變量定義開(kāi)式相似,也是用說(shuō)明語(yǔ)句來(lái)實(shí)現(xiàn)的,但不同于其他類型變量的就是它是用來(lái)專門存放地址的。
指針變量定義的一般開(kāi)式為
類型標(biāo)識(shí)符*指針變量名;
下面都是合法的定義:
int *g1,*g2,*g3;定義g1、g2、g3指向整型數(shù)據(jù)的指針變量。
float *k1,*k2,*k3;定義k1、k2、k3指向?qū)嵭蛿?shù)據(jù)的指針變量。
char *m1,*m2,*m3;定義m1、m2、m指向字符型數(shù)據(jù)的指針變量3。
在定義指針變量值得注意的是:
①“*”是一個(gè)指向符號(hào),表示標(biāo)識(shí)符為指針變量,上面的g1、g2、g3等是指針變量名,而不是*g1、*g2、*g3,值得注意的是指針變量是用來(lái)存放地址的。
②一個(gè)指針變量只能指向同一個(gè)類型的變量。由于不同類型的數(shù)據(jù)在內(nèi)存中所占的字節(jié)數(shù)不同,如果忽而指向一個(gè)整型變量,忽而指向一個(gè)實(shí)型變量,會(huì)使系統(tǒng)無(wú)法管理變量的字節(jié)數(shù)而發(fā)生錯(cuò)誤,所以只有同一類型變量的地址才能放到指向該類型變量的指針變量中。
2.2指針變量的引用
例如:
main()
{
int i=10,j=20;
int *g1,*g2;
g1=&i;
g2=&j;
printf("%d,%d ",i,j);
printf("%d,%d ",*g1,*g2);}
運(yùn)行結(jié)果為:10,20
10,20
本程序定義了兩個(gè)指針變量g1和g2,“g1=&i;和g2=&j;”語(yǔ)句是將i與j的地址分別賦給g1和g2,不能寫成“*g1=&i;和*g2=&j;”。
與指針相關(guān)的兩個(gè)運(yùn)符:
①&:取地址運(yùn)算符。
②*:指針運(yùn)算符或稱間接訪問(wèn)運(yùn)算符,取指針?biāo)赶虻哪繕?biāo)值。
“&”與“*”運(yùn)算符的優(yōu)先級(jí)別相同,按自右而左的方向結(jié)合,如“g1=&i;”語(yǔ)句,若&*g1,先進(jìn)行的是*g1的運(yùn)算,再執(zhí)行&運(yùn)算。如:*&i的含義是什么?當(dāng)然先進(jìn)行&i運(yùn)算,得到i的地址,再進(jìn)行*運(yùn)算。
3數(shù)組的指針與函數(shù)的指針
3.1數(shù)組的指針
有兩個(gè)概念我要必須分清。一個(gè)是指針數(shù)組:首先它是一個(gè)數(shù)組,數(shù)組的元素都是指針,數(shù)組占多少個(gè)字節(jié)由數(shù)組本身決定。它是“儲(chǔ)存指針的數(shù)組”的簡(jiǎn)稱。另一個(gè)是數(shù)組指針:首先它是一個(gè)指針,它指向一個(gè)數(shù)組。
簡(jiǎn)單舉例說(shuō)明:
int *p[10];首先聲明了一個(gè)數(shù)組,數(shù)組的元素是int型的指針。
int (*p)[2];聲明了一個(gè)指針,指向了一個(gè)有兩個(gè)int元素的數(shù)組。
其實(shí)這兩種寫法主要是因?yàn)檫\(yùn)算符的優(yōu)先級(jí),因?yàn)閇]的優(yōu)先級(jí)比*高。所以第一種寫法,p先和[]結(jié)合,所以是一個(gè)數(shù)組,后與*結(jié)合,是指針。后一種寫法同理。
應(yīng)當(dāng)注意,如果數(shù)組為int型,指針變量也應(yīng)是int型。下面是指針元素的賦值:
p=&a[0];
C語(yǔ)言規(guī)定數(shù)組名代表數(shù)組的首地址,是第一個(gè)元素的地址。所以p=&a[0]與p=a是等價(jià)的。注意a不代表整個(gè)數(shù)組,“p=a;”的作用是把a(bǔ)數(shù)組的首地址賦給p,而不是a的所有元素都賦給p。
在定義指針變量時(shí)是可以賦給初值的:
int *p=&a[0];
等效于:
int *p;
p=&a[0];
多維數(shù)組(以二維數(shù)組為例)
二維數(shù)組的定義:
static int a[2][3]={{1,2,3},{4,5,6}};
a是一個(gè)數(shù)組的名字,包含二個(gè)元素:a[0],a[1]。而每個(gè)元素又是一個(gè)一維數(shù)組,每個(gè)一維數(shù)組又包含有三個(gè)元素。如a[0]中的三個(gè)元素分別為a[0][0],a[0][1],a[0][2]。a代表的是二維數(shù)組的首地址。
3.2函數(shù)的指針
指針是可以指向一個(gè)函數(shù)的,在編譯時(shí)被分配給一個(gè)入口地址,這個(gè)入口地址就叫做函數(shù)的指針。在一個(gè)程序中,一個(gè)指針變量可以先后指向不同的函數(shù)。
指向函數(shù)的指針變量定義開(kāi)式為:
數(shù)據(jù)類型標(biāo)識(shí)符(*指針變量名)(參數(shù)1,參數(shù)2);
下面通過(guò)例子來(lái)說(shuō)明用指針形式實(shí)現(xiàn)對(duì)函數(shù)調(diào)用的方法。
int max(int a,int b)
{
if(a>b)return a;
else return b;}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
pmax為函數(shù)指針變量,并把函數(shù)入口地址賦給該函數(shù)指針變量,pmax=max。調(diào)用函數(shù)的形式:(*指針變量名)(參數(shù)表)其中的*號(hào)不是求值運(yùn)算,它只是一種表示符號(hào)。如本程序中的z=(*pmax)(x,y);值得注意的是:函數(shù)指針變量與數(shù)組指針變量是不相同的,數(shù)組指針變量加減一個(gè)整數(shù)可使指針移動(dòng)指向后面或前面的數(shù)組,而函數(shù)指針是沒(méi)有移動(dòng)的意義的
4總結(jié)
C語(yǔ)言指針對(duì)于初學(xué)者來(lái)說(shuō)是一個(gè)短時(shí)間內(nèi)很難掌握的問(wèn)題,指針靈活性較大,對(duì)于剛開(kāi)始學(xué)習(xí)的學(xué)生,要搞清楚指針的各個(gè)方面內(nèi)容,例如:指針類型、指針?biāo)赶虻念愋?、指針?biāo)赶虻膬?nèi)存區(qū),還有指針?biāo)紦?jù)的內(nèi)存區(qū)等基礎(chǔ)方面內(nèi)容。在多思考、多注重比較和多上機(jī)實(shí)踐,才能真正的掌握好指針課程。
參考文獻(xiàn):
[1]譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2000.