李翠蓮
(呂梁學(xué)院離石師范分校, 山西 離石 033000)
指針在《C程序設(shè)計》課程教學(xué)中是必須掌握的重點教學(xué)內(nèi)容之一,是C程序設(shè)計的精華[1],但也是應(yīng)用廣泛、使用靈活、功能強大、掌握難度大、最容易出現(xiàn)錯誤的知識點。熟練掌握并能夠準(zhǔn)確應(yīng)用指針進行程序設(shè)計是駕馭C程序設(shè)計的標(biāo)志,在進行程序設(shè)計時巧妙的利用指針能夠設(shè)計出高效、簡潔的程序,對問題的處理可達到事半功倍的效果。
數(shù)組是具有相同數(shù)據(jù)類型的數(shù)據(jù)依次存儲在連續(xù)的內(nèi)存空間中,在編寫程序時可以使用循環(huán)算法遍歷處理數(shù)組中的每個元素,使編制的程序簡潔、高效[3],數(shù)組的本質(zhì)是數(shù)據(jù)存儲在連續(xù)的存儲空間中,利用連續(xù)地址的特點訪問存儲空間,編程時只要知道存儲空間的首地址和數(shù)據(jù)個數(shù),編程時訪問第一個數(shù)據(jù)后,利用地址變量=首地址±i訪問連續(xù)的存儲空間,從而可以利用循環(huán)算法遍歷數(shù)組中的每個元素。如下算法實現(xiàn)給100個連續(xù)的存儲空間存放02、12、22……992共100個數(shù),代碼簡潔、高效:
int GradeArr[100];
for(int i = 0; i < 100; i++)
GradeArr[i] = i * i;
在計算機科學(xué)技術(shù)中,指針(Pointer)是程序設(shè)計語言中的一種數(shù)據(jù)類型,它利用地址值直接指向(points to)計算機內(nèi)存中的一個存儲單元,通過地址直接指向存儲單元(即變量單元)中的數(shù)據(jù)故稱為“指針”。C程序設(shè)計利用指針取代匯編語言或機器語言直接訪問存儲單元,在編寫系統(tǒng)軟件和硬件控制程序中有非常強大的功能,所以指針是C語言的精華,利用指針可以操控硬件,只要知變量的首地址和變量的個數(shù),就可以用循環(huán)算法遍歷其中的數(shù)據(jù)(有關(guān)指針的定義使用等知識點略)。
分析一組變量:int a = 3,b = 8 ,c = 51 ,d = 88,e = 125;其各變量的地址值連續(xù)并相差值為4,如表1,用“a地址值-i”算法實現(xiàn)遍歷5個變量值,從表可以看出C語言在連續(xù)聲明變量時采用從右到左以壓棧的方式開辟存儲空間,變量地址值內(nèi)存中是連續(xù)的,可以利用連續(xù)的特點采用循環(huán)算法訪問a、b、c、d、e五個變量中的值,如下一個循環(huán)語句等價于5條printf語句,運行結(jié)果如圖1:
圖1 連續(xù)整形變量運行結(jié)果
表1 a、b、c、d、e變量的地址
int a = 3,b = 8 ,c = 51 ,d = 88,e = 125;
for(int i = 0;i < 5;i++)
printf("%c = %d ",97 + i,*(&a - i));∥“&a - i”指針
上述5個字符變量聲明后,用指針連續(xù)訪問的核心算法為:&a - i * 4(其中i=0,1,2,3,4),實現(xiàn)語句如下:
char a = ‘A’,b = ‘B’ ,c = ‘C’ ,d = ‘D’,e = ‘E’;
for(int i = 0;i < 5;i++)
printf("%c = %d ",97 + i,*(&a - i * 4));∥“&a - i *4”指針
上述程序運行結(jié)果如圖2。
圖2 連續(xù)字符型變量運行結(jié)果
計算機中函數(shù)是模塊化程序設(shè)計基礎(chǔ),它是一段固定程序,也稱其為子程序,能實現(xiàn)特定功能的算法。函數(shù)的最主要特征是只有一個入口和一個出口,入口即函數(shù)所帶的各個參數(shù),把函數(shù)的參數(shù)值傳遞到子程序中,作為算法處理的對象,出口即函數(shù)經(jīng)過運算后的結(jié)果返回到主調(diào)用函數(shù)處,程序語言規(guī)定一個函數(shù)只能返回0或1個返回值。在實際問題中有時要求函數(shù)算法結(jié)果影響主調(diào)函數(shù)的幾個值,如對整形數(shù)組中數(shù)據(jù)進行排序,實質(zhì)要求返回多個值與函數(shù)規(guī)定相矛盾,巧妙利用數(shù)組的首地址和數(shù)組元素個數(shù)作為函數(shù)的參數(shù)可以實現(xiàn),該方法實質(zhì)是采用指針來實現(xiàn)。
利用變量指針作為函數(shù)參數(shù)可以實現(xiàn)主調(diào)函數(shù)多變量的數(shù)據(jù)排序,如對于a = 3,b =51 ,c = 8三個變量通過函數(shù)實現(xiàn)a、b、c變量值從大到小排序,用傳統(tǒng)函數(shù)傳遞數(shù)值參數(shù)無法實現(xiàn),而巧妙利用指針該功能很容易實現(xiàn)。實現(xiàn)代碼如下,排序結(jié)果如圖2:
#include
void ThreeChange(int *,int *,int *);∥聲明排序函數(shù)ThreeChange,函數(shù)參數(shù)為指針
void main()
{
int a = 3,b =51 ,c = 8;
ThreeChange(&a,&b,&c);∥調(diào)用ThreeChange函數(shù)
printf(" a = %d b = %d c = %d ",a,b,c);∥輸出a、b、c的值
}
∥排序函數(shù)ThreeChange的定義,接收3個指針變量
void ThreeChange(int * x,int * y,int * z)
{
int temp;
∥實現(xiàn)a的值存儲最大值
if(*x < *y )
{
if(*y < *z)
{
temp = *x;
*x = *z;
*z = temp;
}
else
{
temp = *x;
*x = *y;
*y = temp;
}
}
∥實現(xiàn)y中存儲最大值
if(*y < *z)
{
temp = *y;
*y = *z;
*z = temp;
}
}
在C語言中,指針是其中的精髓,也是掌握的難點,只要真正掌握并理解了指針,在程序設(shè)計教學(xué)中能夠講清講透徹各知識點,在軟件開發(fā)中,能夠靈活利用指針編寫特殊類型的算法,可以編制執(zhí)行效率高的應(yīng)用軟件和系統(tǒng)軟件,并且充分利用指針操作硬件的特性,可以開發(fā)硬件控制系統(tǒng)和實時操作要求高的系統(tǒng)。本文只列舉了指針在整型變量、字符型變量、函數(shù)中的一些應(yīng)用,指針在字符串處理、函數(shù)、結(jié)構(gòu)體、文件操作、堆棧等中也有很強的應(yīng)用,期望本文的知識總結(jié)在教學(xué)中起到靈活利用指針的作用,在編寫程序時靈活利用指針實現(xiàn)高效的程序。
圖3 a、b、c變量值排序結(jié)果