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件)
- 4日前のトップ記事
- 5日前
- 6日前
- 7日前
- 8日前
- ホワイトペーパー
- 話題のタグ
Apple
アプリケーション
セキュリティ
Mac OS X
Firefox
ブラウザ
iPod touch
Windows Vista
OS
Windows XP
Chrome
Webデザイン
Google
Windows 7
Webサービス
オープンソース
Flash
開発環境
インストール
Windows
リファレンス
脆弱性
マイクロソフト
Firefox 3
iPhone 3G
WebKit
Off Topic
Tips
小技
iPhone
UI
HTML
Database
クラウド
Internet Explorer
仮想化
Java
CSS
JavaScript
Microsoft
RIA
モバイル
Opera
Safari
ソフトウェア開発
Ajax
Mozilla
Linux
プログラミング言語
データベース
話題のタグを見る »
MS運営のオープンソース開発プロジェクト支援サイト「CodePlex」を探検する(2)
Snow LeopardではNTFSをサポート--その源流を訪ねる(1)
フォトレポート:「Windows Server 2008 R2」--あまり知られていない有用な機能10選
マイクロソフト、「Office 2010」ベータ版を開発者向けにリリース
―エン・ジャパン厳選求人☆毎週更新―
100万円で実現!中小企業の情報漏えい対策
大丈夫?あなたの会社のセキュリティ対策
【最終警告】パンデミック対策特集
企業ITシステムの企画、構築、運用のイロハ
電力に"ふた"をする独自の省エネ機能とは!?
高まるiSCSIストレージへの注目度