C++动态分配指针数组

10 篇文章 0 订阅
5 篇文章 0 订阅

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 []

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值