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";
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)の値、と出力することを表す。その結果、文字列が出力されることになるわけだ。
ここで、文字へのポインタを使って違う書き方をしてみよう。以下に例を示す。前述の配列の場合と処理の仕方に変わりがないことがおわかりいただけるだろう。
char *p = "Hello"; printf( "%c\n", *p ); /* H と出力される */ printf( "%c\n", *(p + 1) ); /* e と出力される */ printf( "%s\n", p ); /* Hello と出力される */
しかし、前述の配列では、配列変数sを指定された文字列で「初期化」していたのに対し、今回のポインタ変数pには、"Hello"という文字列を指すポインタ(アドレス)が代入されているという違いがある。配列は、まるごと“代入”することができないので、sとvという同じ型の配列があるとき s = v;とは書けないが、p と q という同じ型のポインタであればp = q; と書くことはできる。
たとえば、ポインタ変数pに別の文字列へのポインタを代入したいのであれば、変数を初期化した後でも p = "Welcome"; とすることができる。なお、文字列(文字の配列)以外に、任意の型の配列定数を表現することはできないので、初期化時に int n[] = { 1, 2, 3 }; と書くことはできても、int *p; に対して p = { 1, 2, 3 }; と書くことはできない。
- コメント(12件)
#1 επιστημη
- 2008/03/29 10:05
#2 επιστημη
- 2008/03/29 10:14
#3 がる
- 2008/03/31 00:20
#4 bright
- 2008/04/06 11:12
#5 リュート
- 2008/04/17 21:27
#6 がる
- 2008/04/19 01:33
#7 tomita
- 2008/04/21 13:59
#9 tomita
- 2008/06/03 18:29
#10 tomita
- 2008/06/03 18:29
#11 tomita
- 2008/06/03 18:30
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15件)
- ホワイトペーパー
- 話題のタグ
グーグル、JavaScriptプログラミングツールをリリース
Windowsの歴史 Windows Server 2008編:同じカーネルを持つ「Vista」とは対照的に早くから支持を得たサーバOS
Windowsの歴史 Windows Server 2003 R2編:安定性と先進性の両立目指す「R2」の先駆けとなったOS
モジラ、「Firefox 3.6」の第1ベータ版をリリース
【最終警告】パンデミック対策特集
最大32個のセンサーが電力を徹底管理!
―エン・ジャパン厳選求人☆毎週更新―
大丈夫?あなたの会社のセキュリティ対策
進むストレージ環境の見直し
100万円で実現!中小企業の情報漏えい対策
企業ITシステムの企画、構築、運用のイロハ