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

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

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

ポインタ変数の配列

 ポインタ変数も配列を宣言できる。これは文字列の配列を表す場合によく用いられる。以下にその例を示す。

    char *s[] = { "Japanese", "English", "Chinese" };
    printf( "%s\n", s[ 0 ] );  /* Japanese と出力される */
    printf( "%s\n", s[ 1 ] );  /* English と出力される */
    printf( "%s\n", s[ 2 ] );  /* Chinese と出力される */
    printf( "%s\n", *s );         /* Japanese と出力される */
    printf( "%s\n", *(s + 1) );   /* English と出力される */
    printf( "%s\n", *(s + 2) );   /* Chinese と出力される */

 さきほどの char *s は文字列へのポインタ(正確に言うと、文字列の先頭の文字へのポインタ)をあらわしていたが、今回の char *s[] は、文字列へのポインタ配列の要素である。配列sの要素が char *、つまり s[0](あるいは *s)とすることで、文字列へのポインタが得られるため、上記のようにそれぞれの文字列が表示される。

 文字列へのポインタは、文字列の先頭の文字へのポインタと同じである。以下に例を示そう。

    char *s[] = { "Japanese", "English", "Chinese" };
    printf( "%c\n", **s );         /* J と出力される */
    printf( "%c\n", **(s + 1) );   /* E と出力される */
    printf( "%c\n", **(s + 2) );   /* C と出力される */

 *s により "Japanese" という文字列へのポインタが得られ、**s(これは*(*s)と同じ)によって先頭の文字が得られる。また、*(*s + 1) は (*s)[1] と同じであるため、"a"("Japanese" の2文字目)が表示される。*(*(s + 2) + 3) であれば、"n"("Chinese" の4文字目)が表示される。

 このようにポインタは何段にも繰り返して適用できるのだが、実用上は2段程度にとどめておくことが望ましい。3段以上のポインタが必要な場合は、typedef や構造体などでいったん、途中のものに名前を与えておくとよいだろう。

  • コメント(12件)

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

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

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

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

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

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

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

配列の変数名をそのままポインタ変数名として扱えるのではなく、配列のデータアクセスと、ポインタ経由でのデータアクセスに同じ表現が... 続きを見る
» 不適切なコメントを報告する

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

気になったことがあるのですが,コメントの書き方で char s[] = "Hello"; と char s[] = {'H', 'e', 'l', 'l', 'o', '\0'}; が同じ... 続きを見る
» 不適切なコメントを報告する

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

ところで。「C/C++のポインタの機能--配列との関係」が未修正のまま大分時間が経過しているように見えるのですが。 いつ頃修正されるご... 続きを見る
» 不適切なコメントを報告する

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

builder編集部の冨田です。 連載の修正が遅れており、ご迷惑をおかけしております。申し訳ございません。 いついつまでに修正を完了... 続きを見る
» 不適切なコメントを報告する

#8 オワタ  - 2008/05/13 10:42

この筆者の方はIなのですか。。。 Iのレベルも落ちたもんだ。。。
» 不適切なコメントを報告する

#9 tomita  - 2008/06/03 18:29

builder編集部の冨田です。 本記事を6月3日の18時に修正しました。 修正が多岐に渡っているため、修正個所を逐次記載するのではなく... 続きを見る
» 不適切なコメントを報告する

#10 tomita  - 2008/06/03 18:29

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

#11 tomita  - 2008/06/03 18:30

2ページ目 ポインタ変数の配列  ポインタ変数も配列を宣言できる。これは文字列の配列を表す場合によく用いられる。以下にその例... 続きを見る
» 不適切なコメントを報告する

#12 tomita  - 2008/06/03 18:30

以上です。 読者の皆様には大変ご迷惑をおかけしましたこと、深くお詫び申し上げます。
» 不適切なコメントを報告する
記事に関係する情報をコメントでお寄せください

ニックネーム : CNET_IDにログインしてコメントする

コメント本文(必須) :
  • 新着記事
  • 人気記事
  • 特集
  • ブログ