指针数组,怎么理解这个词呢,和前面我教大家理解指针常量和常量指针一样。指针数组首先应该是一个数组,即指针组成的数组,那么很容易理解,这个数组里面的元素都是指针类型的,比如我们定义一个字符数组 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个字节的长度),我们用这个数组中的每个指针元素的长度乘以数组元素的个数,即可以得到这个指针数组的长度,那么反过来我们就可以如果例子中一样求出它的指针元素个数,而每个指针都是指向一个字符串的,所以我们就可以得到一共有多少条字符串,一点也不复杂。