共享内存中使用指针_详解c++中字符指针数组的使用

之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用。

涛哥:c++中的动态数组使用​zhuanlan.zhihu.com
zhihu-card-default.svg

指针数组,就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。

先看下面的代码,注意看代码中的注解:

#include <iostream>  
#include <string>  
using namespace std;  void print_char(char* array[],int len);//函数原形声明  void main(void)    
{  
//-----------------------------段1-----------------------------------------  char *a[]={"abc","cde","fgh"};//字符指针数组  char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc0字符串的首地址  cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;  
//-------------------------------------------------------------------------  //-----------------------------段2-----------------------------------------  char* test[]={"abc","cde","fgh"};//注意这里是引号,表示是字符串,以后的地址每加1就是加4位(在32位系统上)  int num=sizeof(test)/sizeof(char*);//计算字符串个数  print_char(test,num);  cin.get();  
//-------------------------------------------------------------------------  
}  void print_char(char* array[],int len)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的长度  
{  for(int i=0;i<len;i++)  {  cout<<*array++<<endl;  }  
}

下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子:

char *a[]={"abc","cde","fgh"};  
char* *b=a;  
cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

  char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc0,cde0,fgh0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

结果是:

abc
cde
fgh

  可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到0后停止.

  我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout<<*array++<<endl;当然我们也可以改写为cout<<array[i]<<endl,这里在循环中的每次加1操作和段1代码总的道理是一样的,注意看下面的图!

 下面是内存结构示意图:

1ca71a0ec8b3959bcbcced6a4a8a7a07.png

到这里这两个非常重要的知识点我都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧。

备注:

于作者水平,难免有理解和描述上有疏漏或者错误的地方,欢迎共同交流;部分参考已经在正文和参考文献中列表注明,但仍有可能有疏漏的地方,有任何侵权或者不明确的地方,欢迎指出,必定及时更正或者删除;文章供于学习交流,转载注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试用例项目写作,通用测试用例写作方法

测试用例工作过程软件测试用例设计和软件测试用例写作软件测试用例设计&#xff1a;从设计层面考虑(功能性、可用性、安全性等方面)&#xff1b;软件测试用例写作&#xff1a;指的是软件测试用例的写作规范(格式、标识的命名规范等)软件测试用例设计设计出用例的内容&#xff0…

二叉树学习笔记--先序遍历

首先数据二叉树中数据存储如图&#xff0c;n代表节点为空 &#xff0c;此时退出当前函数。 分解各个步骤如图&#xff0c;为了简化&#xff0c;将节点中的数据代表节点&#xff0c;先left执行&#xff0c;left执行前先输出数据&#xff0c;left执行时&#xff0c;right等待。此…

apache cgi 模块安装

apache安装,请参照:http://httpd.apache.org/docs/2.4/ 安装系统: Fedora release 21 (Twenty One) (x64) 版本:Server version: Apache/2.4.12 (Unix) 安装方式: 源码安装, 源文件目录: /home/web/docs/soft/httpd-2.4.12 安装目录: /usr/local/apache2 在安装apache 之后,…

eslint 无法格式化ts_vscode保存代码,自动按照eslint规范格式化代码设置

vscode保存代码&#xff0c;自动按照eslint规范格式化代码设置编辑器代码风格一致&#xff0c;是前端代码规范的一部分。我们现在前端绝大部分都在使用eslint&#xff0c;或者将要把代码改为eslint&#xff0c;那么此时我们怎么方便使用这个规范呢&#xff0c;下面我来介绍一下…

8个球放入3个盒子方式_8种土豆做法,好吃到根本停不下来!

石锅土豆鸡块鸡腿3&#xff0c;土豆1&#xff0c;青椒2洋葱一半&#xff0c;辣椒10g&#xff0c;肉桂5g八角2&#xff0c;生姜10克&#xff0c;大蒜15g1。将鸡腿洗净切成大块&#xff0c;切成薄片&#xff0c;切青椒&#xff0c;切洋葱片&#xff0c;姜片和蒜片去皮。2、在锅里…

计算机d盘被拒绝访问了怎么办,如果硬盘分区被拒绝访问或无法访问该怎么办?...

拒绝访问硬盘分区的原因可能是硬盘分区表已损坏&#xff0c;导致系统无法正确读取硬盘的分区信息&#xff0c;或者可能是某些软件(例如加密软件)已使用&#xff0c;并且磁盘权限已修改.Bit提供了几种解决方案&#xff0c;请参见下面的具体操作方法:修复方法一&#xff0c;使用硬…

c++电费管理系统_能耗管理系统

园区能源管理系统是专注于园区能耗在线监测以及能耗评估的综合能源管理系统。一、应用背景存在问题&#xff1a;园区建筑功能构成较为复杂&#xff0c;用能设备多&#xff0c;耗能量大&#xff0c;监管难度高。安全、舒适是首要考虑因素&#xff0c;维持这一效果需要消耗更多的…

泰拉瑞亚服务器怎么让玩家注册,上线10年,《泰拉瑞亚》为何变成了一款交友游戏?...

《泰拉瑞亚》这款游戏,最初于2011年5月16日在PC上发行,之后也陆续登录安卓和苹果手机端,如今已走过了十个年头。也许对于《泰拉瑞亚》部分人并不是很熟悉,但提起《我的世界》,相信大部分游戏爱好者都会有共同话题。而《泰拉瑞亚》就是被玩家戏称为横版的Minecraft,因为游戏给玩…

【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁

Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第一行给出N,M表示布丁的个数和好友的操作次数. 第二行N个数A1,A2...An表示第i个布丁的颜色从第三行…

小程序秒杀活动服务器,微信小程序官方上线张大仙周年活动,人数太多把服务器弄崩溃了...

原标题&#xff1a;微信小程序官方上线张大仙周年活动&#xff0c;人数太多把服务器弄崩溃了说起如今人气最旺的《王者荣耀》主播&#xff0c;莫过于就是靠着一手“素质直播”走遍天下的张大仙了。之前由于一些合同上面的问题&#xff0c;张大仙被迫停播了一段时间&#xff0c;…

curl 怎么在xp下使用_Http Post 快速使用

点击上方蓝字可直接关注&#xff01;方便下次阅读。如果对你有帮助&#xff0c;麻烦点个在看或点个赞&#xff0c;感谢~一直对http很陌生&#xff0c;这次借助libcurl分享一个快速使用http post的案例。平台&#xff1a;ubuntu16.04一、libcurl的安装1. Git上下载 master最新代…

ajax 高并发请求,理解node.js处理高并发请求原理

很少分享技术文章&#xff0c;写的不好的地方请大家多多指教&#xff0c;本文是自己对于node.js的一些见解&#xff0c;如有纰漏请在评论区交流。高并发策略通常高并发的解决方案就是提供多线程模型&#xff0c;服务器为每个客户端请求分配一个线程&#xff0c;使用同步 I/O&am…

abaqus生成adams柔性体_基于ADAMS 的大型反铲挖泥机加装破碎锤 结构动力学分析

刘 斌 徐沪萍 王 磊武汉理工大学物流工程学院 武汉 430063摘 要&#xff1a;以配备液压破碎锤的反铲挖泥船反铲挖泥机为研究对象&#xff0c;简单介绍加装液压破碎锤方案&#xff0c;然后运用动力学理论和相关的动态仿真软件&#xff0c;通过建立反铲挖泥机的刚柔耦合模型&…

rust加载不进去服务器eac_基于腾讯云的 Rust 和 WebAssembly 函数即服务

腾讯云云函数 (SCF) 已经支持十多种编程语言和运行时框架。腾讯云最近发布的 SCF custom runtime&#xff08;自定义运行时&#xff09;更进一步 —— SCF 现在可以支持用任何编程语言编写的函数。本文将介绍如何在云函数 SCF 中运行用 Rust 编写的 WebAssembly 函数。我们先介…

ceb怎么转换成word_PDF怎么转换成Word?分享免费转换技巧!

PDF怎么转换成Word&#xff1f;pdf格式无法编辑众所周知的事&#xff0c;但如果我们需要将其进行编辑使用的话&#xff0c;就需要将pdf格式转换成word格式。可是怎么将pdf转换成word一直是件令人头疼的事&#xff01;所以今天小编给大家分享几个pdf转word免费转换技巧&#xff…

[FZYZOJ 1038] 隧道

P1038 -- 隧道 时间限制&#xff1a;1000MS 内存限制&#xff1a;65536KB Description 一座小镇正在着手建造自己的地铁线路网。小镇坐落在许多小岛上&#xff0c;小岛之间通过隧道或者桥梁连接。地铁就在这些已有的桥梁和隧道的基础上建成。由于地铁主要是在地下&#xf…

7极限精简版64位_DNF:国服更新64位客户端深度体验,真的有如此丝滑吗?

DNF最新最快资讯&#xff0c;最全最细攻略&#xff0c;尽在骑乌龟的蜗牛12年&#xff0c;地下城的游戏客户端终于获得了升级&#xff0c;从32位更新到了64位&#xff0c;关于更新带来的游戏好处大家应该都在很多地方看过&#xff0c;而国服正式服也终于在8.20版本的更新中将客户…