C++动态分配指针数组

2023-10-27

C++动态分配指针数组

C++ Primer 4.34练习要求将存在vector<string>中的string取出,存入另外的字符数组中,并用一个字符指针数组存放每个字符数组的首地址。

动态分配一个字符数组不难,用

1
char  *ptr = new  char [N];
1
就可以了,但是如果想分配一个字符指针数组(一个数组,里面的每个元素存放着指向其他字符数组的指针),就稍稍需要改变一下。
1
先把这道习题我做的代码贴一下,再对动态分配字符指针数组的方法做分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*******************************************************
  *     C++ Primer 4.34  4.35习题                       *
  *编写程序读入一组 string 类型的数据,并将它们存储在   *
  *vector 中。接着,把该 vector 对象复制给一个字符指针数*
  *组。为 vector 中的每个元素创建一个新的字符数组,并把 *
  *该 vector 元素的数据复制到相应的字符数组中,最后把指 *
  *向该数组的指针插入字符指针数组。                     *
  *******************************************************/
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
 
using  namespace  std;
 
int  _tmain( int  argc, _TCHAR* argv[])
{
     vector<string> ivec;
     ivec.push_back( "Hello world" );
     ivec.push_back( "Hello everybody!" );
     ivec.push_back( "Hello my family!" );
 
     vector<string>::size_type size = ivec.size();
     vector<string>::iterator itr = ivec.begin();
     vector<string>::iterator end = ivec.end();
 
     vector<string>::size_type vSize = ivec.size();   // vector的大小
     char  **chars = new  char * [vSize]; // 动态分配字符指针数组
                                                // 赋值操作左边有两个星号可理解为chars本身的元素是一个char*型,
                                         // new操作符又返回了一个指针指向字符数组,所以是char **chars
                                         // 注意赋值的右侧不能是new (char*)[vSize],没有在new后面加()的语法。
      
            int  i = 0;
     while (itr != end) {    
         string str = *itr;                     // 从vector中得到下一个string
         
         const  char * strContent = str.c_str();  // 将string转换为c风格字符串
         size_t  strLength = strlen (strContent);   // 求字符串长度,不包含null字符
         char  *strArray = new  char [strLength + 1];   // 为当前字符串动态分配一个数组
  
         chars[i] = strArray;                          // 记录这个字符数组的首地址
                                                       // chars[i]相当与*(chars + i)
         for ( int  k = 0; k != strLength + 1; k++) {     // 将字符串的内容拷贝到新的数组中
             strArray[k] = strContent[k];
         }
         ++itr;
         ++i;
     }
 
     for ( int  j = 0; j != 3; j++) {          // 显示各字符串
         cout << chars[j] << endl;
         delete  [] chars[j];           // 释放字符数组
     }
     delete  [] chars;                  // 释放字符指针数组
 
     return  0;
}

这段代码根据vector<string>中元素的个数动态分配指针数组,采用的语法为

1
char  **chars = new  char * [vSize]; // 动态分配字符指针数组

我最初奇怪赋值语句的左侧为什么是两个*操作符,命名返回的是一个指向数组的指针嘛。但是后来一想,char **chars可以这样理解:char* (*ptr),即new返回的是一个指向数组的指针(*ptr),其中的每个元素是char*型的,这样就好理解了。在这之后,我想要更清楚的展示new的是一个字符指针数组,所以画蛇添足的写了下面这句

1
char  **chars = new  ( char *) [vSize];
1
这时编译器报错了,我查了一些资料,比较好的一个解释是<strong> new 后面不能跟(),</strong>c++标准中没有这样的语法。因此即便是写成
1
int  *p = new  ( int )[N];
1
都是错误的。

在为chars的元素赋值时,用的是

1
chars[i] = strArray;
将字符数组的首地址赋给了chars的第i个元素,它等价于
1
*(chars + i) = strArray

在输出字符串时,是cout << chars[j] 而不是 cout << *chars[j]  这是比较基础的了,chars[j]给除了一个字符数组的首地址,输出的是从这个地址到第一个'\0'中间的内容,而*chars[j]给出的是字符数组首地址这个元素,所以只输出数组的第一个字符。

最后值得注意的是delete一个数组空间的时候,不要忘记是delete []

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++动态分配指针数组 的相关文章

  • Visual Studio 中的递归

    当我运行这个非常简单的递归代码时 我发现当函数 recursCheck 使用整数参数时 我的内存在 Win32 模式下跳到 200 MB 在 x64 模式下跳到 45 MB 并且当参数的类型为 short Win32 模式使用的内存为 4
  • 不同 int 类型的运算

    我有一个使用多种不同 int 类型的程序 最常用的是uint64 t和标准int 但是我想知道我是否可以安全地进行它们之间的混合操作 例如我有一个uint64 t我想添加一个int并将该值存储为另一个值uint64 t 做这样的事情安全吗
  • R.string.value 帮助 android 通知

    怎么了 CharSequence contentTitle R string value 错误无法从 int 转换为 CharSequence 有办法解决这个问题还是我错过了什么 我试过 String s R string value Ch
  • C 如何计算没有浮点精度的百分比(千)

    如何将 2 个 int 值的百分比计算为表示百分比的 int 值 更精确的是千分之一 背景 目的 使用没有 FPU 的处理器 浮点计算所需的时间要长 100 倍 int x 25 int y 75 int resultPercentage
  • C 中 long int 和 int 的大小显示 4 个字节 [重复]

    这个问题在这里已经有答案了 我做了以下实验来了解系统中 long int 和 int 的大小 系统规格 64位Windows 7 gcc MinGW 编译器 日食CDT 我对得到的输出感到困惑 我没有理由支持我的程序的结果 如果有人对此有任
  • 为什么 GNU binutils 和 GDB 合并为一个包?

    https sourceware org git gitweb cgi p binutils gdb git https sourceware org git gitweb cgi p binutils gdb git 尤其是请参阅tags
  • 在c中动态增加数组(int *)的大小

    我想动态地将数字添加到c中的数组中 我的想法是分配一个大小 1 的新数组 添加数字 释放根数组并将指针从 temp 更改为根数组 像这样 void addNumber int a int size int number size size
  • 在 Swift 中将 bytes/UInt8 数组转换为 Int

    如何将4字节数组转换为对应的Int let array UInt8 gt let value Int Example Input 0 0 0 x0e Output 14 我在互联网上找到的一些代码不起作用 let data NSData b
  • 如何从 3 位整数中提取单个数字? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这不是家庭作业问题 我只是好奇 如果我有一个计算 3 位数字的程序 比如 123 我怎样才能得到 1 我试图在最后打印一条消息 上面写着
  • gcc 内部使用相同的位表示 int 和 char 吗?

    我只是为了好玩而玩弄 unicode 字符 不使用 wchar t 支持 我只使用常规的 char 数据类型 我注意到 当以十六进制打印它们时 它们显示了完整的 4 个字节 而不是仅一个字节 对于前 考虑这个 c 文件 include
  • 使用 HashSet 创建整数集

    我想创建一个表示整数集的类 使用HashSet
  • 如何在 Swift 中将 Int 转换为字符

    我在这里挣扎了十多分钟 失败了 我屈服了 我需要在 Swift 中将 Int 转换为 Character 但无法解决它 Question 你如何转换 cast an Int integer to a Character char 在斯威夫特
  • 为什么我在 MySQL 中设置更大的 INT 数据类型长度时没有收到错误消息?

    我对 MySql 中的数据类型长度有点困惑 我阅读了参考手册http dev mysql com doc refman 5 0 en data types html http dev mysql com doc refman 5 0 en
  • C语言中如何比较float变量和double变量?

    float num1 1 if num1 1 printf Yes it is equal n else printf No it is not equal n 输出 gt 是的 它是相等的 whereas float num1 1 2 i
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • 添加 char 和 int

    据我了解 字符是一个字符 即一个字母 一个digit 标点符号 制表符 空格或类似的东西 因此 当我这样做时 char c 1 System out println c 输出 1 正是我所期望的 那么为什么当我这样做时 int a 1 ch
  • char和int相加的结果[重复]

    这个问题在这里已经有答案了 考虑以下代码 System out println G 2 输出是 73 我能知道为什么以及如何做吗 在java中 一个char占用16位UTF 16编码 G s unicode https www rapidt
  • MIPS 汇编不支持“.set noat”吗?

    目前 我正在学习GNU as 并在 info as 中找到了很多有用的信息 我发现 set noat 在MIPS指定的代码中使用 但是当在 info as 中搜索该指令时 我在节点 alpha指令 中找到了它的解释 但在 MIPS Depe

随机推荐

  • windows10下安装docker,并且安装ubuntu环境

    1 系统要求 支持 64 位版本的 Windows 10 Pro 且必须开启 Hyper V 若版本为 v2004 及以上则无需开启 Hyper V 或者 64 位版本的 Windows 10 Home v2004 及以上版本 我的版本 w
  • 如何用一篇文章生成知识图谱

    https www zhihu com question 355473263
  • sockjs-web实时通信协议

    sockjs web实时通信应用解决方案 socksjs 客户端和服务器端api尽可能简洁 尽量靠近websocket api 支持服务端扩展和负载均衡技术 传输层应该全面支持跨域通信 如果受到代理服务器的限制 传输层能优雅地从一种方式回退
  • Unity图集相关问题

    Unity图集相关问题 前言 最近查找图集相关资料的时候看到了Unity论坛上的一篇帖子 其中Unity官方技术人员解释了 Include In Build 究竟有什么作用 Include In Build 简而言之 如果勾选了 就意味着S
  • Centos7.x安装netcat以及netcat连接被拒绝(Ncat: Connection refused.)或者没有反应的解决方法

    一 情况 出现以下情况 Jay localhost001 nc Ncat You must specify a host to connect to QUITTING 或是 Jay localhost002 nc localhost001
  • 统计海量文章内容中出现次数前K大的单词并输出(完整实现)

    统计海量文章内容中出现次数前K大的单词并输出 很经典的问题 解决思路如下 1 遍历所有单词 利用hashmap来统计每一个单词出现的值 得到hashmap示例如下 key value a 3 bc 1 cd 8 2 这时候 问题变成了在海量
  • 代码审计-工具介绍及简单思路

    工具篇之开发环境 仅供参考 0x01 PhpStorm PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具 旨在提高用户效率 可深刻理解用户的编码 提供智能代码补全 快速导航以及即时错误检查 是一个非常不错
  • 基于SpringBoot的器材管理系统

    介绍 有一家实验室 里面有100台实验设备 5个实验员 每个设备使用之前需要对设备进行检查 现在存在以下痛点 实验员检查器材的时候 发现器材不见了 他们都不知道器材是坏了还是其他实验员用到其他器材 非常不方便 希望开发一套软件进行器材的借
  • python写一个实时语音转文字得方法

    可以使用第三方库 SpeechRecognition 进行实时语音识别 首先需要安装这个库 然后可以使用如下代码进行实时语音转文字 import speech recognitionas sr 创建语音识别对象 r sr Recognize
  • Python制作GUI学生管理系统毕设,大学生总会用得到

    有很多可爱的大学生跟我吐槽 咋这个大学跟我想象的不一样呢 老师叫我们自己做 还是那句话 技术才是硬道理 源码 资料电子书文末名片获取 有个经典案例就是 学生管理系统 写完了放在那也是放着 所以今天分享给大家吧 话不多说 咱们直接开始吧 代码
  • redhat6安装mysql8.0.33

    1 下载mysql 官网地址 https downloads mysql com archives community 下载步骤 过滤操作系统版本 下载后 上传到服务器Downloads目录 2 安装mysql8 解压压缩包 tar xvf
  • 背景减除法的研究

    本篇对背景减除法做了一个全面的分析与比较 首先 按照数学模型的不同 把背景减除法分为六大类 然后 在每一类中选取了一些经典的 有代表性的算法进行介绍 最后 通过理论研究与实验比较 从准确性 鲁棒性 内存需求和计算速度的角度 指出了这些种背景
  • ASN1编解码

    ASN1编码 ASN 1 Abstract Syntax Notation One 是一种用于描述数据结构和编码规则的标记语言 它广泛应用于网络通信 加密和安全领域 ASN 1 定义了一种独立于具体编程语言的数据表示方法 可以确保不同计算机
  • SystemInformationRequestHandlers

    SystemInformationRequestHandlers Solr Wiki Search Solr Wiki Login SystemInformationRequestHandlers FrontPage RecentChang
  • stm32的串口DMA空闲中断接收不等长数据,stm32F4的usart2-DMA-IDLE收发

    1 串口为什么要使用DMA 好处 提高系统实时性 stm32单片机的串口没有FIFO 使用字节中断的方式去接收 会频繁进入中断 影响系统实时性 好在stm32的串口可以级联DMA使用 在大数据量连续发送 接收的场合尤为实用 降低CPU负载
  • 计算机图形学 期末复习 微课版 孔令德 五、三维变换与投影 期末复习

    三维几何变换矩阵 为3 3阶子矩阵 对物体进行比例 旋转 反射和错切变换 对图形进行平移变换 三维基本变换 平移变换 比例变换 旋转变换 反射变换 平行投影 平行投影分为正投影和斜投影 投影方向垂直于投影面的平行投影称为正投影 投影方向不垂
  • H.1#【计算机组成原理】—1.2 I/O端口寻址和访问控制方式

    I O端口寻址和访问控制方式 前言 目录 I O端口寻址和访问控制方式 I O端口和寻址 统一编址 独立编址 I O 端口的地址分配 接口访问控制 I O端口和寻址 I 0地址的设置方式 统一编译和独立编址 统一编址 原理 把I O控制器中
  • 硬件学习 PAD9.5 day02 原理图绘制中的操作,PCB 封装的制作

    1 原理图中的连线操作 1 1 点击连线按钮 1 2 点击需要连线的地方连接即可 1 3 双击即可停止连线 2 原理图的总线绘制 2 1 按下总线绘制按钮 2 2 画一条总线 总线名称 总线名字 起始数字 结束数字 2 3 分线连接总线 注
  • 自媒体常用的3个运营技巧,快速进阶,高效运营

    自媒体运营有技巧吗 很多自媒体新手对运营技巧不是很了解 今天就分享几个自媒体大神在运营中常用的小技巧 帮助新手们快速进阶 高效做运营 1 学会养号 自媒体新手有一个很大的运营误区就是 内容随意发 在新手期阶段是需要养号的 也就是说在账号流量
  • C++动态分配指针数组

    C 动态分配指针数组 C Primer 4 34练习要求将存在vector