C/C++ ポインタ入門 > ポインタと配列
Nobuhide Tsuda
Oct-2013
ポインタと配列
- ポインタと配列には深い関係がある
- 実は「*(ptr+i)」と「ptr[i]」は異なる表記だが意味は全く同じだぞ
- 配列 v が宣言されているとき、単に「v」と記述すると、配列の先頭アドレスを返すぞ
演習問題:
- char v[10]; を宣言し、v と &v[0] が同じアドレスであることを確認しなさい
- 配列はポイント先が自動的に確保され、アドレスを変更できないという違いがあるが、それ以外はポインタと同じものだぞ
| 配列 | ポインタ |
宣言例 | char v[10]; | char *ptr = &v[0]; |
要素 | 自動的に確保される | 自動的に確保されない |
i番目の要素 | v[i] | ptr[i] |
i番目の要素 | *(v+i) | *(ptr+i) |
現要素 | (*v で先頭要素) | *ptr |
値の変更 | v = アドレス; は不可 | ptr = アドレス; で可能 |
次に進む | 不可 | ++ptr または ptr++ または ptr += 1 |
前に戻るむ | 不可 | --ptr または ptr-- または ptr -= 1 |
- 以下の様に、配列要素をポインタの様な書き方で参照することも可能。
const int SIZE = 10;
int v[SIZE];
for(int i = 0; i < SIZE; ++i)
std::cout << *(v + i) << "\n";
ポインタと文字列
- "hoge" の様な文字列は、実は const char 型の配列だぞ。
- 文字数分の領域が自動的に確保され、文字がそこに格納される
- 文字列の最後にはヌル文字('\0')が格納される。
- 文字列の終わりはヌル文字かどうかで判定するんだぞ
- 文字列は const char 型配列なので、中身を書き換えることはできないぞ
- 式の中で "hoge" の様な文字列を書くと、その先頭アドレスを返すぞ
const char *ptr = "hoge"; // ptr は "hoge" の先頭('h')を指す
文字列の最初から最後までを処理する場合は、最後のヌル文字('\0')を見つけるまで処理をするんだぞ
const char *ptr = "hoge"; // ptr は "hoge" の先頭('h')を指す
while( *ptr != '\0' ) {
*ptr に対する何らかの処理;
++ptr; // ptr を前に進める
}
上記プログラムの処理の部分と、ptr を前に進める部分は *ptr++ と書くことで1行に出来るぞ。
演習問題:
- 文字列 char str[] = "abc"; の先頭アドレスを表示するプログラムを書きなさい。
- 文字列 const char *ptr = "abc"; を実行し、ptr の指すアドレスを表示するプログラムを書きなさい。
- 文字列 "abc" の先頭アドレスを const char *ptr に入れ、中身を表示するプログラムを書きなさい。
- bool isIncludeX(const char *ptr) 引数として与えられた文字列中に 'X' がある場合は true を、
無い場合は false を返す関数を実装しなさい。
前:ポインタの移動
|上:C/C++ ポインタ入門
|次:ポインタへのメモリ割り当て