指針數組,怎么理解這個詞呢,和前面我教大家理解指針常量和常量指針一樣。指針數組首先應該是一個數組,即指針組成的數組,那么很容易理解,這個數組里面的元素都是指針類型的,比如我們定義一個字符數組 char *pn[]={"Fred","Barney","Wilma","Betty"}; 其實指針數組就像一個二維數組,不過它比二維數組有更多的優勢,就像一級指針和一維數組的區別一樣,指針有更大的靈活性。指針數組首先建立一個一維數組空間,這塊空間在內存中是連續的,這個一維數組中的每一個元素實際上都是一個指針(這是關鍵),這個指針指向內存的某個未知的空白區域,我們進行 cout<<pn[i]<<endl; 就可以把其中的四個字符串輸出,比如我們定義“Fred”的時候,其實就是把“Fred”這個字符串放到內存中的一塊空白區域中,然后把這個空間的首地址給指針數組的第一個數組元素,所以我們進行輸出第一個數組元素的操作時(cout<<pn[0]<<endl;)它便可以通過這個pn[0]中的內容里的地址格式找到那塊指向的地址空間,然后把它按字符串的形式輸出(為什么會輸出字符串,具體實現請看昨天的博客隨筆《字符指針的特別之處》)。
下面我們看一段程序:
#include<iostream.h> void print(char *[],int); void main()
{ char *pn[]={"Fred","Barney","Wilma","Betty"};
int num=sizeof(pn)/sizeof(char *);
print(pn,num); }
void print(char *arr[],int len)
{ for(int i=0;i<len;i++) //輸出各字符串
cout<<(int)arr[i]<<" " //十進制輸出字符串地址
<<arr[i]<<endl; //輸出字符串 }
關於輸出字符串地址為什么要用(int)arr[i]也請先看昨天的博客隨筆《字符指針的特別之處》。下面我說說,為什么用 int num=sizeof(pn)/sizeof(char *); 可以得到字符串的數目,這里關系到指針數組的實質,好多人都弄不懂就是因為還沒有理解透指針數組。 sizeof(pn)是求這個數組的長度,而不是它里面所包含的字符串的總長度,因為前面我們說過了,指針數組,首先是一個數組,只不過它里面的元素是指針,每種類型的指針的長度都是固定的(其實任何指針類型都是4個字節的長度),我們用這個數組中的每個指針元素的長度乘以數組元素的個數,即可以得到這個指針數組的長度,那么反過來我們就可以如果例子中一樣求出它的指針元素個數,而每個指針都是指向一個字符串的,所以我們就可以得到一共有多少條字符串,一點也不復雜。