正文 第37章 指針10(1 / 2)

相應地,對於多個字符串(字符串數組)可以用二維字符數組來處理或用字符指針數組來處理。讓我們先了解一下指針數組。

一個數組中的元素均為指針類型數據,則稱這個數組為指針數組。指針數組中的所有元素的指針類型必須相同。指針數組本身也是數組,所以它與數組的定義基本相同。一維指針數組的定義為:

類型名*數組名[數組長度];

例如:int*p[4];

這條語句定義了一個長度為4的指針數組,數組中的每個元素都是一個指針變量,都可以指向一個整型變量。注意它與定義指向4個元素組成的一維數組指針變量的區別,例如:

int(*p)[4];

這條語句定義了一個指針變量p,這個指針變量可以指向一個長度為4的一維整型數組。

下麵我們來討論用二維字符數組和一維字符指針數組來處理多個字符串的問題,例如:

charstr[3][10]={"Japan","China","Russian"};

char*pstr[3]={"Japan","China","Russian"};

第一行定義了一個二維字符數組來存放3個字符串,第二行定義了一個一維字符指針數組來存放字符串的指針。

這兩種存儲形式都可以用來處理多個字符串,兩者的差別與字符串處理的兩種表示形式的差別是一樣的,這裏不再贅述。

[例1021]將若幹字符串按字母順序輸出。

1.用二維字符數組來處理

#include

voidsort(charstr[][20],intn)  {  charp[20];  inti,j,k;  for(i=0;i  {k=i;  for(j=i+1;j  if(strcmp(str[j],str[k])  k=j;  if(k!=i)  {strcpy(p,str[i]);strcpy(str[i],str[k]);strcpy(str[k],p);}  }  }  voidprint(charstr[][20],intn)  {  inti;  for(i=0;i  printf("%s\n",str[i]);  }  voidmain()  {  charstr[3][20]={"Japan","China","Russian"};  sort(str,3);  print(str,3);  }  程序說明:  (1)在排序過程中,交換的是字符串,如果字符串比較多,交換次數多的話,執行效率會比較低。  (2)采取固定的長度來存儲字符串,可能會浪費存儲空間。  (3)voidsort(charstr[][20],intn)與voidsort(char(*str)[20],intn)等價。  2.用一維字符指針數組來處理  #include  voidsort(char*str[],intn)  {  char*p;  inti,j,k;  for(i=0;i  {k=i;  for(j=i+1;j  if(strcmp(str[j],str[k])  k=j;  if(k!=i)  {p=str[i];str[i]=str[k];str[k]=p;}  }  }  voidprint(char*str[],intn)  {  inti;  for(i=0;i  printf("%s\n",str[i]);  }  main()  {  char*str[3]={"Japan","China","Russian"};  sort(str,3);  print(str,3);  }  程序說明:  (1)在排序過程中,交換的是字符串的指針,字符串的存儲位置不變,執行效率會比較高。  (2)按字符串的長度來分配存儲空間,比較節省存儲空間。  (3)voidsort(char*str[],intn)與voidsort(char**str,intn)等價。這裏出現了二級指針,其實指針數組名就是一個二級指針。  前麵介紹的指針都是一級指針,一級指針是直接指向數據對象的指針,一級指針變量中存放的是數據對象的地址,二級指針是指向指針的指針,它並不直接指向數據對象,而是指向一級指針變量,二級指針變量中存放的是一級指針變量的地址,三級指針是指向指針的指針的指針,它指向的是二級指針變量,三級指針變量中存放的是二級指針變量的地址,其他的多級指針依此類推。  二級指針的定義格式:  基類型**指針變量名;  其中指針變量名前有兩個“*”,表示是一個二級指針。  例如,有以下定義:  inta=5,*p,**pp;  p=&a;  pp=&p;  一級指針變量p存放的是變量a的地址,即它指向了變量a;二級指針變量pp存放的是一級指針變量p的地址,即它指向了一級指針變量p。所以對變量a的訪問有三種形式:a、*p和**pp,三者是等價的。  這裏很容易犯的錯誤是:  pp=&&a;  認為對變量a用兩次取地址的運算,就得到了指向這個變量的二級指針。實際上,&a是變量a的地址,所以是一個常量。常量不能作取地址的運算。一般情況下,二級指針變量必須與一級指針變量聯合使用才有意義,因為二級指針變量存放的是一級指針變量的地址。不能將二級指針變量指向數據對象。  [例1022]用二級指針變量訪問一維數組。  voidmain()  {  intnum[5]={10,20,30,40,50};  int*a[5],**p,i;  p=a;  for(i=0;i  a[i]=num+i;  for(i=0;i  printf("%d",**p++);  }  程序說明:該程序的初始化情況,然後通過二級指針變量的移動來訪問數組num中的元素。