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編集部の冨田です。
連載の修正が遅れており、ご迷惑をおかけしております。申し訳ございません。
いついつまでに修正を完了... 続きを見る
» 不適切なコメントを報告する
#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ページ目
ポインタ変数の配列
ポインタ変数も配列を宣言できる。これは文字列の配列を表す場合によく用いられる。以下にその例... 続きを見る
» 不適切なコメントを報告する
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15件)
- ホワイトペーパー
- 話題のタグ
Mac OS X
オープンソース
OS
Microsoft
iPod touch
開発環境
Firefox
WebKit
ブラウザ
Windows
インストール
小技
Windows 7
Windows XP
PHP
HTML
Flash
モバイル
Linux
リファレンス
Windows Vista
Firefox 3
アプリケーション
セキュリティ
Chrome
RIA
iPhone 3G
Internet Explorer
Database
Safari
Google
iPhone
Tips
Java
Ajax
Webデザイン
JavaScript
プログラミング言語
ソフトウェア開発
仮想化
脆弱性
Mozilla
マイクロソフト
UI
Opera
データベース
Webサービス
Off Topic
Apple
CSS
話題のタグを見る »
グーグル、JavaScriptプログラミングツールをリリース
Windowsの歴史 Windows Server 2008編:同じカーネルを持つ「Vista」とは対照的に早くから支持を得たサーバOS
Windowsの歴史 Windows Server 2003 R2編:安定性と先進性の両立目指す「R2」の先駆けとなったOS
モジラ、「Firefox 3.6」の第1ベータ版をリリース
100万円で実現!中小企業の情報漏えい対策
企業ITシステムの企画、構築、運用のイロハ
―エン・ジャパン厳選求人☆毎週更新―
【最終警告】パンデミック対策特集
大丈夫?あなたの会社のセキュリティ対策
進むストレージ環境の見直し
最大32個のセンサーが電力を徹底管理!