现在的位置: 首页 > 综合 > 正文

指针数组的奥秘

2017年12月28日 ⁄ 综合 ⁄ 共 1375字 ⁄ 字号 评论关闭
 

  老婆这几天在学指针,所以我也跟着她复习,顺便帮她讲讲不懂的东西,然后在网上做一个小小的总结,所以这两天我在网上发表的随笔都是关于指针的,呵呵,十一放假有空,终于可以来看看我的博客了。昨晚上老婆遇到指针数组的问题,今天我在这里说说……

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

抱歉!评论已关闭.