linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > c/c++/c# >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·Windows/Linux下配置Eclipse+C
·c语言static与extern的用法
·VC++(Ctime日期函数)应用
·typedef struct和struct的区别
·C/C++对文件操作
·C常用算法程序实例-线性代数方
·C#发送Email邮件方法总结
·struct的初始化,拷贝及指针成
·C语言入门实例 switch使用
·c++二叉树实现源代码
·对初学者的建议:如何学习C语言
·C++ Builder 处理控件中的文本
·常用的BCB & Delphi 函数
·C++入门经典教程完全版01-引言
·C++ Builder 使用Canvas对象的
最新文章
·使用C/C++扩展Python
·C语言入门实例 switch使用
·在C#里实现DATAGRID的打印预览
·如何使用 Visual C# .NET 创建
·C#发送Email邮件方法总结
·一道C#面试题目引发的思考
·c语言艺术清屏
·c语言static与extern的用法
·大数的阶乘算法
·C#编码好习惯
·构造函数,复制构造函数
·typedef struct和struct的区别
·struct的初始化,拷贝及指针成
·超强的指针学习笔记推荐
·STL中erase方法对链表类容器的
Google
 
c/c++中的字符指针数组,指向指针的指针的含义
[ 作者:  加入时间:2007-10-23 14:06:26  来自:Linux联盟收集整理 ]
就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针! ikKLinux联盟
ikKLinux联盟
先看下面的代码,注意看代码中的注解! ikKLinux联盟
ikKLinux联盟
//程序作者:管宁 ikKLinux联盟
//站点:www.cndev-lab.com ikKLinux联盟
//所有稿件均有版权,如要转载,请务必著名出处和作者 ikKLinux联盟
#include <iostream>ikKLinux联盟
#include <string>ikKLinux联盟
usingnamespacestd; ikKLinux联盟
ikKLinux联盟
voidprint_char(char* array[],intlen);//函数原形声明 ikKLinux联盟
ikKLinux联盟
voidmain(void) ikKLinux联盟
{ ikKLinux联盟
//-----------------------------段1----------------------------------------- ikKLinux联盟
char*a[]={"abc","cde","fgh"};//字符指针数组 ikKLinux联盟
char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc\0字符串的首地址 ikKLinux联盟
cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<//------------------------------------------------------------------------- ikKLinux联盟
ikKLinux联盟
//-----------------------------段2----------------------------------------- ikKLinux联盟
char* test[]={"abc","cde","fgh"};//注意这里是引号,表示是字符串,以后的地址每加1就是加4位(在32位系统上) ikKLinux联盟
intnum=sizeof(test)/sizeof(char*);//计算字符串个数 ikKLinux联盟
print_char(test,num); ikKLinux联盟
cin.get(); ikKLinux联盟
//------------------------------------------------------------------------- ikKLinux联盟
} ikKLinux联盟
ikKLinux联盟
voidprint_char(char* array[],intlen)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的长度 ikKLinux联盟
{ ikKLinux联盟
for(inti=0;i{ ikKLinux联盟
cout<<*array++<} ikKLinux联盟
} ikKLinux联盟
下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子: ikKLinux联盟
ikKLinux联盟
char*a[]={"abc","cde","fgh"}; ikKLinux联盟
char* *b=a; ikKLinux联盟
cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<ikKLinux联盟

ikKLinux联盟
ikKLinux联盟
char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<结果是 ikKLinux联盟
ikKLinux联盟
abc ikKLinux联盟
cde ikKLinux联盟
fgh ikKLinux联盟
ikKLinux联盟
可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到\0后停止. ikKLinux联盟
ikKLinux联盟
ikKLinux联盟
ikKLinux联盟
我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout<<*array++<ikKLinux联盟
到这里这两个非常重要的知识点我们都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧!

ikKLinux联盟
ikKLinux联盟
内存结构示意图!

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·指向指针的指针  (2006-09-19 21:58:48)