C/C++のポインタの機能--配列との関係
ポインタは配列と深い関係があることを前回言及したが、今回はそれが具体的にどのようなことなのかを説明していきたい。
現在、本稿には技術的な誤りが存在するため、詳細をレビュー中です。
初めてご覧になる方は、コメント欄もあわせてお読み下さい。
また、読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。
ポインタ変数と配列との関係
ポインタ変数と配列との深い関係を表す例を示そう。それは、配列の変数名をそのままポインタ変数名として扱えるということだ。
int n[] = { 7, 3, 5, 9, 2 };
printf( "%d\n", *n ); /* 7 と出力される */
上記は、nを5つのint型の要素を持つ配列として宣言した後、すぐに*nの値を表示させている。この結果は7と出力される。つまり、*nは配列の最初の要素(n[ 0 ])の値を表していることになる。
では、n[ 1 ]以降の値を*nを使って表すにはどうしたらよいだろうか。そのためには以下のように記述する。
int n[] = { 7, 3, 5, 9, 2 };
printf( "%d\n", *(n + 1) ); /* 3 と出力される */
printf( "%d\n", *(n + 2) ); /* 5 と出力される */
こうすると、*(n + 1)がn[ 1 ]の値を表し、*(n + 2)がn[ 2 ]の値を表すことがお分かりいただけるだろう。
ポインタ変数と文字列との関係
C/C++においては、文字列は文字の配列として扱われるので、ポインタ変数との関係はほとんど上記のint型配列の場合と同じなのだが、異なっている点もある。以下に例を示そう。
char s[] = "Hello"; /* s[] = { 'H', 'e', 'l', 'l', 'o', '\0' } */
printf( "%c\n", *s ); /* H と出力される */
printf( "%c\n", *(s + 1) ); /* e と出力される */
printf( "%c\n", *(s + 2) ); /* l と出力される */
printf( "%s\n", s ); /* Hello と出力される */
配列sにHelloという文字列を代入した後、*sを書式%cで出力すると、最初の文字Hが表示される。これはs[ 0 ]の値だ。同じ書式で*(s + 1)の値を出力すると、eが表示される。これはs[ 1 ]の値だ。ここまでのところは、書式を%cにしている以外はint型の場合と同じだ。
int型と異なるのは書式%sのときだ。ここでは*sではなくsを記述している。以前にもこのような処理については説明しているが、実は%sは特別な書式で、桁数の指定がない時は文字列の終端('\0')までを*sから順に*(s + 1)の値、*(s + 2)の値...と出力することを表す。その結果、文字列が出力されることになるわけだ。
ちなみに文字列は、s[]ではなく*sに直接代入する記述も可能だ。以下に例を示す。両者とも処理の仕方は特に変わりないことがお分かりいただけるだろう。これは文字列のみに有効な記述であり、数値型でint *n = { 1, 2, 3 };などと記述することはできない。
char *s = "Hello";
printf( "%c\n", *s ); /* H と出力される */
printf( "%c\n", *(s + 1) ); /* e と出力される */
printf( "%s\n", s ); /* Hello と出力される */
- 31人の推薦記事
- 0人がクリップ
-
ソーシャルブックマーク(-)
- トラックバック(0)
- コメント(7件)
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15件)
- 2日前のトップ記事
- 3日前
- 4日前
- 5日前
- ホワイトペーパー
- 話題のタグ
現場の知見から得られるノウハウを共有しましょう
Firefox 3が対応したdisplayプロパティの値(2)
Ruby・Python・JavaScript・PHPについてどう思いますか?:Tim Brayに聞いてみた
来日したゲイツ氏が経団連で行ったスピーチ全文
グリーンITと「幼年期の終わり」
Web開発者向けツール Opera Dragonflyのアルファ版が登場
あなたがプログラムを理解できない10の理由:第1回
Rubyでどう書く?:RubyでPDF履歴書を作成する
Neil YoungがJavaOneにやってきた
オンラインマーケティングの最重要課題
-Simplify IT- ITをシンプルに 連載第2回