- 1、本文档共2页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北京8维教育谈CC中字符指针数组的含义
北京八维教育谈C/C++中字符指针数组的含义 就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。
先看下面的代码,注意看代码中的注解:
#include #include using namespace std;void print_char(char* array[],int len);//函数原形声明void main(void){//-----------------------------段1----------------------------------------- char *a[]={abc,cde,fgh};//字符指针数组 char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc\0字符串的首地址 cout*b|*(b+1)|*(b+2)
下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子:
char *a[]={abc,cde,fgh};char* *b=a;cout*b|*(b+1)|*(b+2)
char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc,cde,fgh,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout*b|*(b+1)|*(b+2)
结果是
abc
cde
fgh
可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到后停止.
我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout*array++
到这里这两个非常重要的知识点我们都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧。
您可能关注的文档
最近下载
- ECLIPSE局部网格加密做法.ppt
- 如何利用团体标准做好患者跌倒评估和预防PPT.pptx
- 2022年湖南长沙中考语文试题【含答案】.docx VIP
- 2023年湖南长沙中考语文试题.pdf VIP
- 2024年镇村(社区)后备干部考试复习题库 .pdf VIP
- 数学-湖南省长沙市(炎德英才大联考)长郡中学2025届高三上学期月考试卷(三)试题和答案.docx
- 必威体育精装版经典数学函数图像大全-数学函数图像-函数图像全.docx
- 2024届高考英语作文复习专项读后续写:雀斑烦恼任务单素材.docx VIP
- 2024 年度民主生活会“四个对照”方面(存在问题、原因剖析及整改措施).docx VIP
- 托福词汇词以类记-张红岩(完整有目录)经典.pdf
文档评论(0)