C/C++のポインタの機能--配列との関係

沖林正紀
2008/03/28 17:00

ポインタは配列と深い関係があることを前回言及したが、今回はそれが具体的にどのようなことなのかを説明していきたい。

現在、本稿には技術的な誤りが存在するため、詳細をレビュー中です。
初めてご覧になる方は、コメント欄もあわせてお読み下さい。
また、読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。

ポインタ変数と配列との関係

 ポインタ変数と配列との深い関係を表す例を示そう。それは、配列の変数名をそのままポインタ変数名として扱えるということだ。

    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 と出力される */
  • コメント(7件)

#1 επιστημη  - 2008/03/29 10:05:24

> ポインタ変数と配列との深い関係を表す例を示そう。 > それは... 続きを見る
» 不適切なコメントを報告する

#2 επιστημη  - 2008/03/29 10:14:39

[2page冒頭] > さきほど*sで1つの文字列を表していたが、 違いま... 続きを見る
» 不適切なコメントを報告する

#3 がる  - 2008/03/31 00:20:21

んと…とりあえず筆者の方に伺ってみたいのですが。 char s[] = "H... 続きを見る
» 不適切なコメントを報告する

#4 bright  - 2008/04/06 11:12:53

配列の変数名をそのままポインタ変数名として扱えるのではなく、配列の... 続きを見る
» 不適切なコメントを報告する

#5 リュート  - 2008/04/17 21:27:08

気になったことがあるのですが,コメントの書き方で char s[] = "... 続きを見る
» 不適切なコメントを報告する

#6 がる  - 2008/04/19 01:33:55

ところで。「C/C++のポインタの機能--配列との関係」が未修正のまま大分... 続きを見る
» 不適切なコメントを報告する

#7 tomita  - 2008/04/21 13:59:01

builder編集部の冨田です。 連載の修正が遅れており、ご迷惑をおかけし... 続きを見る
» 不適切なコメントを報告する
記事の感想やご意見をコメントでお寄せください(CNET_IDログインが必要です)
ログイン パスワードを忘れた方  |  新規登録
  • 新着記事
  • 人気記事
  • 特集
  • ブログ