2017年09月28日
《その54》 ポインタによる文字列 / 文字列の配列(p.303演習8-4)
文字列リテラル
配列による文字列
char str[] = "ABC";
cout << str; … "ABC"
要素str[0] … 'A'
要素str[1] … 'B'
要素str[2] … 'C'
要素str[3] … '\0'
str = "XYZ"; // 代入はNG(エラー)
ポインタによる文字列
char* ptr = "PQR";
cout << ptr; … "PQR"
要素ptr[0] … 'P'
要素ptr[1] … 'Q'
要素ptr[2] … 'R'
要素ptr[3] … '\0'
pqr = "XYZ"; // 代入はOK
◆ ポインタによる文字列は、ポインタptrと文字列"PQR"の両方が記憶域を占有する。
文字列の配列
《配列による文字列》の配列
char a[][5] = { "LISP", "C", "Ada" };
a[0][0] :"L" , a[0][1] :"I" , a[0][2] :"S" , a[0][3] :"P" , a[0][4] :"\0"
a[1][0] :"C" , a[1][1] :"\0", a[1][2] :"\0", a[1][3] :"\0", a[1][4] :"\0"
a[2][0] :"A" , a[2][1] :"d" , a[2][2] :"a" , a[2][3] :"\0", a[2][4] :"\0"
cout << a[0]; … "LISP"
cout << a[1]; … "C"
cout << a[2]; … "Ada"
sizeof(a); … 15
sizeof(a[0]); … 5
sizeof(a[1]); … 5
sizeof(a[2]); … 5
◆ 初期化子の文字列リテラルが連続して配置されることが保証されている。
《ポインタによる文字列》の配列
char* p[] = { "PAUL", "X", "MAC" };
p[0][0] :"P" , p[0][1] :"A" , p[0][2] :"U" , p[0][3] :"L" , p[0][4] :"\0"
p[1][0] :"X" , p[1][1] :"\0"
p[2][0] :"M" , p[2][1] :"A" , p[2][2] :"C" , p[2][3] :"\0"
cout << p[0]; … "PAUL"
cout << p[1]; … "X"
cout << p[2]; … "MAC"
sizeof(p); … 12(ポインタ三つ分のサイズ)
sizeof(p[0]); … 4 (ポインタのサイズ)
sizeof(p[1]); … 4 ( 〃 )
sizeof(p[2]); … 4 ( 〃 )
◆ 初期化子の文字列リテラルが連続して配置されるという保証がない。
新版明解C++入門編 p.303 演習8-4
List8-11 では、各配列の個数 3 が定数としてプログラム中(for文の制御式)に埋め込まれている。計算によって書きかえたプログラムを作成せよ。
// p303_演習8-4
#include <iostream>
using namespace std;
int main()
{
char a[][5] = {"LISP", "C", "Ada"};
char* p[] = {"PAUL", "X", "MAC"};
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
cout << "a[" << i << "] = \"" << a[i] << "\"\n";
for (int i = 0; i < sizeof(p) / sizeof(p[0]); i++)
cout << "p[" << i << "] = \"" << p[i] << "\"\n";
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6751937
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック