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:24
#2 επιστημη
- 2008/03/29 10:14:39
#3 がる
- 2008/03/31 00:20:21
#4 bright
- 2008/04/06 11:12:53
#5 リュート
- 2008/04/17 21:27:08
#6 がる
- 2008/04/19 01:33:55
#7 tomita
- 2008/04/21 13:59:01
#9 tomita
- 2008/06/03 18:29:19
#10 tomita
- 2008/06/03 18:29:41
#11 tomita
- 2008/06/03 18:30:04
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15件)
- ホワイトペーパー
- 企画特集
ストレージメディア特設サイト開設
パンデミック対策特集
御社のログ活用しませんか!?
集積度も性能も、業界最高水準のブレードPC
中小企業のセキュリティリスクとは?
インターネット上の悪意を未然に防ぐには?
ESBでIT投資の無駄を劇的に解消する
今注目の「サジェスト検索」−デモ掲載中
仮想環境を実現するソリューション特集
【徹底対談】運用管理ツールの賢い使い方
SOA、BPM、SaaS −今、企業に必要なこと
ロリポップ!がリニューアル
そのストレージで仮想化に対応できますか?
◆エン・ジャパン厳選求人☆毎週更新◆
セキュリティ&ユーザ事例【SIer Club】
- エンタープライズにおけるSUSEの強み
- サーバー監視・運用のコストを削減するには
- サービス・ドリヴン・データセンター
- ■ストレージ容量50%削減保証■
- 話題のタグ
Windows 7はLinuxへの切替が簡単:注目の仮想ディスクフォーマット「VHD」
iPhone OS 3.0で変わった「絵文字」
OSSのクラウド基盤「Eucalyptus」を使う(4)--インストール〜ノード構築
俳優経験者が指南する「人前で上手く話すためのティップス10選」
「うるまでるびペイント」登場:絵は上手下手ではなく制作過程に楽しみが
待てば回路の日和あり--「iPhone 3GS」発売、しかし――