資源描述:
《指向指針指針》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、10.7指針數(shù)組和指向指針的指針10.7.1指針數(shù)組的概念一個(gè)數(shù)組的元素值全為指針則是指針數(shù)組。指針數(shù)組是一組有序的指針的集合。指針數(shù)組的所有元素都必須是具有相同存儲(chǔ)類型和指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組說明的一般形式為:類型說明符*數(shù)組名[數(shù)組長度]其中類型說明符為指針值所指向的變量的類型。例如:int*pa[3]表示pa是一個(gè)指針數(shù)組,它有三個(gè)數(shù)組元素,每個(gè)元素值都是一個(gè)指針,指向整型變量。【例10.33】通??捎靡粋€(gè)指針數(shù)組來指向一個(gè)二維數(shù)組。指針數(shù)組中的每個(gè)元素被賦予二維數(shù)組每一行的首地址,因此也可理解為指向
2、一個(gè)一維數(shù)組。main(){inta[3][3]={1,2,3,4,5,6,7,8,9};int*pa[3]={a[0],a[1],a[2]};int*p=a[0];inti;for(i=0;i<3;i++)printf("%d,%d,%d",a[i][2-i],*a[i],*(*(a+i)+i));for(i=0;i<3;i++)printf("%d,%d,%d",*pa[i],p[i],*(p+i));}本例程序中,pa是一個(gè)指針數(shù)組,三個(gè)元素分別指向二維數(shù)組a的各行。然后用循環(huán)語句輸出指定的數(shù)組元素。其中*
3、a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p與a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。讀者可仔細(xì)領(lǐng)會(huì)元素值的各種不同的表示方法。應(yīng)該注意指針數(shù)組和二維數(shù)組指針變量的區(qū)別。這兩者雖然都可用來表示二維數(shù)組,但是其表示方法和意義是不同的。二維數(shù)組指針變量是單個(gè)的變量,其一般形式中"(*指針變量名)"兩邊的括號(hào)不可少。而指針數(shù)組類型表示的是多個(gè)指針(一組有序指針)在一般形式中"*指針數(shù)組名"兩邊不能有括號(hào)。例如:int(*p)[3]
4、;表示一個(gè)指向二維數(shù)組的指針變量。該二維數(shù)組的列數(shù)為3或分解為一維數(shù)組的長度為3。int*p[3]表示p是一個(gè)指針數(shù)組,有三個(gè)下標(biāo)變量p[0],p[1],p[2]均為指針變量。指針數(shù)組也常用來表示一組字符串,這時(shí)指針數(shù)組的每個(gè)元素被賦予一個(gè)字符串的首地址。指向字符串的指針數(shù)組的初始化更為簡單。例如在例10.32中即采用指針數(shù)組來表示一組字符串。其初始化賦值為:char*name[]={"Illagalday","Monday","Tuesday","Wednesday","Thursday","Friday","Satu
5、rday","Sunday"};完成這個(gè)初始化賦值之后,name[0]即指向字符串"Illegalday",name[1]指向"Monday"......。指針數(shù)組也可以用作函數(shù)參數(shù)。【例10.34】指針數(shù)組作指針型函數(shù)的參數(shù)。在本例主函數(shù)中,定義了一個(gè)指針數(shù)組name,并對(duì)name作了初始化賦值。其每個(gè)元素都指向一個(gè)字符串。然后又以name作為實(shí)參調(diào)用指針型函數(shù)day_name,在調(diào)用時(shí)把數(shù)組名name賦予形參變量name,輸入的整數(shù)i作為第二個(gè)實(shí)參賦予形參n。在day_name函數(shù)中定義了兩個(gè)指針變量pp1和pp2,
6、pp1被賦予name[0]的值(即*name),pp2被賦予name[n]的值即*(name+n)。由條件表達(dá)式?jīng)Q定返回pp1或pp2指針給主函數(shù)中的指針變量ps。最后輸出i和ps的值。main(){staticchar*name[]={"Illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};char*ps;inti;char*day_name(char*name[],intn);printf("inputD
7、ayNo:");scanf("%d",&i);if(i<0)exit(1);ps=day_name(name,i);printf("DayNo:%2d-->%s",i,ps);}char*day_name(char*name[],intn){char*pp1,*pp2;pp1=*name;pp2=*(name+n);return((n<1
8、
9、n>7)?pp1:pp2);}【例10.35】輸入5個(gè)國名并按字母順序排列后輸出?,F(xiàn)編程如下:#include"string.h"main(){voidsort(char*n
10、ame[],intn);voidprint(char*name[],intn);staticchar*name[]={"CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};intn=5;sort(name,n);print(name,n);}voidsort(char*na