馒头の窝

       有时候 飞翔 不一定需要翅膀
           因为两个人的世界 就是天堂……

If I were in heaven, I'd write your name on every star
 for all to see just how much you mean to me.
Love乐乐のme~`` ^_^    

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

  指针数组,怎么理解这个词呢,和前面我教大家理解指针常量和常量指针一样。指针数组首先应该是一个数组,即指针组成的数组,那么很容易理解,这个数组里面的元素都是指针类型的,比如我们定义一个字符数组 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个字节的长度),我们用这个数组中的每个指针元素的长度乘以数组元素的个数,即可以得到这个指针数组的长度,那么反过来我们就可以如果例子中一样求出它的指针元素个数,而每个指针都是指向一个字符串的,所以我们就可以得到一共有多少条字符串,一点也不复杂。
posted on 2005-10-06 11:14 馒头 阅读(5429) 评论(8)  编辑 收藏 引用 所属分类: 1.『C路艰难』

FeedBack:
# re: 指针数组的奥秘
2006-03-30 18:38 | crazyrabbit
而运行的结果并不是内存联系的呀,
是不是操作系统作了手脚呀.

虚拟内存搞的鬼?  回复  更多评论
  
# re: 指针数组的奥秘
2007-04-20 16:06 | thinkinnight
char **a[10];呢  回复  更多评论
  
# re: 指针数组的奥秘
2007-04-20 16:21 | thinkinnight
or
char *(*a)[10];  回复  更多评论
  
# re: 指针数组的奥秘[未登录]
2008-03-24 16:33 | yy
sizeof(pn)/sizeof(char *);这个还是麻烦你给我讲一下
sizeof(char *)应该为4字节吧,sizeof(pn)为整个指针数组的长度
这个怎么就得到字符串的个数了呢??
  回复  更多评论
  
# re: 指针数组的奥秘[未登录]
2008-10-23 16:18 | A
误导新人啊!  回复  更多评论
  
# re: 指针数组的奥秘
2009-07-19 16:48 | 随便看看,寻求答案
sizeof()方法求指针数组的长度不可行  回复  更多评论
  
# 请教下你
2009-08-04 13:06 |
看过你博客中有关指针及字符指针的文章收益博多。在此谢过。但有个小小的问题是否可以请教呢?既然一个字符串代表的是字符首元素的地址,那么用一个字符串初始化一个字符数组是例如 :

char a[ ] = "c++"

这个代码是把c字符的地址存放在这个数组的第一个单元中吗?这样显然不对啊。在c++中一个字符串不是 const char类型的数组吗? 而对于 char *p = "c++”为什么就是把c字符的地址存放在指针p中呢?望指教,在此谢过。我的qq624604754

  回复  更多评论
  
# re: 指针数组的奥秘
2010-03-10 17:22 | C++初学者
不是放在p中 p有p自己的地址,

p 所指向的头地址 为 "C++" 字符串中的头地址;

即你可以睇成P也为一个普通的变量,只不过p里面藏得就是"C++"的地址  回复  更多评论
  

每天10分钟,轻松学英语
专题:iPad  jQuery  Chrome OS
博客园首页  IT新闻  程序员微博  招聘频道  学英语
标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
 
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
Windows 7专题

相关链接: