C++动态分配指针数组
2017-09-13 12:06
316 查看
转载自
“http://www.cnblogs.com/kadinzhu/archive/2011/05/10/2041841.html”
C++ Primer 4.34练习要求将存在vector中的string取出,存入另外的字符数组中,并用一个字符指针数组存放每个字符数组的首地址。
动态分配一个字符数组不难,用
就可以了,但是如果想分配一个字符指针数组(一个数组,里面的每个元素存放着指向其他字符数组的指针),就稍稍需要改变一下。
先把这道习题我做的代码贴一下,再对动态分配字符指针数组的方法做分析:
/[b]*********************************************[/b]
C++ Primer 4.34 4.35习题
编写程序读入一组 string 类型的数据,并将它们存储在 vector 中。接着,把该 vector 对象复制给一个字符指针数组。为 vector 中的每个元素创建一个新的字符数组,并把该 vector 元素的数据复制到相应的字符数组中,最后把指向该数组的指针插入字符指针数组。
[b]*********************************************[/b]/
这段代码根据vector中元素的个数动态分配指针数组,采用的语法为:
我最初奇怪赋值语句的左侧为什么是两个操作符,命名返回的是一个指向数组的指针嘛。但是后来一想,char **chars可以这样理解:char (ptr),即new返回的是一个指向数组的指针(*ptr),其中的每个元素是char型的,这样就好理解了。在这之后,我想要更清楚的展示new的是一个字符指针数组,所以画蛇添足的写了下面这句
这时编译器报错了,我查了一些资料,比较好的一个解释是new后面不能跟(),c++标准中没有这样的语法。因此即便是写成
都是错误的。
在为chars的元素赋值时,用的是
将字符数组的首地址赋给了chars的第i个元素,它等价于
在输出字符串时,是cout << chars[j] 而不是 cout << *chars[j] 这是比较基础的了,chars[j]给除了一个字符数组的首地址,输出的是从这个地址到第一个’\0’中间的内容,而*chars[j]给出的是字符数组首地址这个元素,所以只输出数组的第一个字符。
最后值得注意的是delete一个数组空间的时候,不要忘记是delete []。
“http://www.cnblogs.com/kadinzhu/archive/2011/05/10/2041841.html”
C++ Primer 4.34练习要求将存在vector中的string取出,存入另外的字符数组中,并用一个字符指针数组存放每个字符数组的首地址。
动态分配一个字符数组不难,用
char *ptr = new char ;
就可以了,但是如果想分配一个字符指针数组(一个数组,里面的每个元素存放着指向其他字符数组的指针),就稍稍需要改变一下。
先把这道习题我做的代码贴一下,再对动态分配字符指针数组的方法做分析:
/[b]*********************************************[/b]
C++ Primer 4.34 4.35习题
编写程序读入一组 string 类型的数据,并将它们存储在 vector 中。接着,把该 vector 对象复制给一个字符指针数组。为 vector 中的每个元素创建一个新的字符数组,并把该 vector 元素的数据复制到相应的字符数组中,最后把指向该数组的指针插入字符指针数组。
[b]*********************************************[/b]/
#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的大小 vector<string>::size_type vSize = ivec.size(); 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中元素的个数动态分配指针数组,采用的语法为:
char **chars = new char* [vSize]; // 动态分配字符指针数组
我最初奇怪赋值语句的左侧为什么是两个操作符,命名返回的是一个指向数组的指针嘛。但是后来一想,char **chars可以这样理解:char (ptr),即new返回的是一个指向数组的指针(*ptr),其中的每个元素是char型的,这样就好理解了。在这之后,我想要更清楚的展示new的是一个字符指针数组,所以画蛇添足的写了下面这句
char **chars = new (char*) [vSize];
这时编译器报错了,我查了一些资料,比较好的一个解释是new后面不能跟(),c++标准中没有这样的语法。因此即便是写成
int *p = new (int) ;
都是错误的。
在为chars的元素赋值时,用的是
chars[i] = strArray;
将字符数组的首地址赋给了chars的第i个元素,它等价于
*(chars + i) = strArray
在输出字符串时,是cout << chars[j] 而不是 cout << *chars[j] 这是比较基础的了,chars[j]给除了一个字符数组的首地址,输出的是从这个地址到第一个’\0’中间的内容,而*chars[j]给出的是字符数组首地址这个元素,所以只输出数组的第一个字符。
最后值得注意的是delete一个数组空间的时候,不要忘记是delete []。
相关文章推荐
- C++动态内存分配(堆)
- C++动态分配和撤销内存以及结构体类型作为函数参数
- c++:最简单的动态分配
- c/c++中动态内存分配处理字符串的细节问题
- C和C++动态内存分配和释放的区别
- C与C++动态分配,释放内存的区别
- 如何在C++中动态分配二维数组
- c++:动态内存分配(new和delete的使用)
- c与c++分别是怎样动态分配和释放内存的,有什么区别?
- c++ new delete 动态分配二维数组
- C与C++动态分配,释放内存的区别
- C++如何实现类对象只能动态分配或只能静态分配
- C/C++动态分配与释放内存的区别详细解析
- C与C++中动态分配与释放内存的区别
- C++ 动态分配 结构体
- C和C++动态内存分配和释放的区别
- C与C++动态分配,释放内存的区别
- C++动态内存分配(堆)
- C/C++动态分配与释放内存的区别详细解析
- C++中动态分配二维数组的方法(zz)