C++動的割当てポインタ配列

3479 ワード

C++Primer 4.34練習ではvectorに存在するstringを取り出し、別の文字配列に格納し、各文字配列のヘッダアドレスを1文字ポインタ配列で格納する必要がある.
文字配列を動的に割り当てるのは難しくありません.
char *ptr = new char[N];
    ,               (    ,                     ),         。
              ,                  :
/*******************************************************

 *     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の要素の個数に基づいてポインタ配列を動的に割り当て、構文は次のとおりです.
char **chars = new char* [vSize]; //           

最初は、付与文の左側がなぜ2つの*オペレータなのか不思議でしたが、名前は配列を指すポインタを返しますか.しかし、後で考えると、char**charsは、char*(*ptr)、すなわちnewが配列を指すポインタ(*ptr)を返し、その各要素がchar*型であることが理解できる.その後、newをもっとはっきり見せたいのは文字ポインタの配列なので、蛇に足を添えて次の文を書きました.
char **chars = new (char*) [vSize];
        ,       ,         new     (),c++          。       
int *p = new (int)[N];

charsの要素に値を割り当てるときに使用されるのは
chars[i] = strArray;
文字配列のヘッダアドレスはcharsのi番目の要素に割り当てられ、それはcharsのi番目の要素に等価である.
*(chars + i) = strArray

文字列を出力する場合、cout<*chars[j]ではなくcout<最後に注目すべきはdeleteの配列空間の場合、delete[]であることを忘れないでください.