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:24
> ポインタ変数と配列との深い関係を表す例を示そう。
> それは、配列の変数名をそのままポインタ変数名として扱えるということだ。
... 続きを見る
» 不適切なコメントを報告する
#2 επιστημη
- 2008/03/29 10:14:39
[2page冒頭]
> さきほど*sで1つの文字列を表していたが、
違います。*sは"文字列"ではなく(先頭の)"文字"です。
文字列を表すのは*... 続きを見る
» 不適切なコメントを報告する
#3 がる
- 2008/03/31 00:20:21
んと…とりあえず筆者の方に伺ってみたいのですが。
char s[] = "Hello";
と
char *s = "Hello";
との違いが「どのあたりにある」と... 続きを見る
» 不適切なコメントを報告する
#4 bright
- 2008/04/06 11:12:53
配列の変数名をそのままポインタ変数名として扱えるのではなく、配列のデータアクセスと、ポインタ経由でのデータアクセスに同じ表現が... 続きを見る
» 不適切なコメントを報告する
#5 リュート
- 2008/04/17 21:27:08
気になったことがあるのですが,コメントの書き方で
char s[] = "Hello";
と
char s[] = {'H', 'e', 'l', 'l', 'o', '\0'};
が同じ... 続きを見る
» 不適切なコメントを報告する
#6 がる
- 2008/04/19 01:33:55
ところで。「C/C++のポインタの機能--配列との関係」が未修正のまま大分時間が経過しているように見えるのですが。
いつ頃修正されるご... 続きを見る
» 不適切なコメントを報告する
#7 tomita
- 2008/04/21 13:59:01
builder編集部の冨田です。
連載の修正が遅れており、ご迷惑をおかけしております。申し訳ございません。
いついつまでに修正を完了... 続きを見る
» 不適切なコメントを報告する
#9 tomita
- 2008/06/03 18:29:19
builder編集部の冨田です。
本記事を6月3日の18時に修正しました。
修正が多岐に渡っているため、修正個所を逐次記載するのではなく... 続きを見る
» 不適切なコメントを報告する
#10 tomita
- 2008/06/03 18:29:41
1ページ目
ポインタ変数と配列との関係
ポインタ変数と配列との深い関係を表す例を示そう。それは、配列の変数名をそのままポイ... 続きを見る
» 不適切なコメントを報告する
#11 tomita
- 2008/06/03 18:30:04
2ページ目
ポインタ変数の配列
ポインタ変数も配列を宣言できる。これは文字列の配列を表す場合によく用いられる。以下にその例... 続きを見る
» 不適切なコメントを報告する
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15件)
- ホワイトペーパー
-
パフォーマンス主導型の組織:もう到達しましたか? −パフォーマンス主導型組織を構築してビジネス・プロセスを最適化する−
-
【会計システム事例】企業の成長に合わせ、既存の財務会計システムを変更せず、DWH・BIツール活用によりお客さま要件を最大限に反映
-
09年はモバイル動画元年になるのか〜BeeTVへの期待〜
-
【テクニカル・レポート】NetAppとVMware Virtual Infrastructure 3におけるストレージのベスト・プラクティス
-
データセンターのコスト削減策と今後の方向性
-
【会計システム事例】企業の成長に合わせ、既存の財務会計システムを変更せず、DWH・BIツール活用によりお客さま要件を最大限に反映
-
【会計システム事例】拠点におけるビジネスの機動性はそのままに、データ随時連携を実現し、本社出納業務を効率化
-
【三井住友海上:BPM導入事例】人間が動かすビジネスモデルをシステム化する
-
組織力強化に必要なのは情報共有!国内導入実績228万ユーザ以上を誇るグループウェア desknet's(デスクネッツ)の導入は、日立システムにおまかせください。
-
Microsoft製品の機能・性能をフルに引き出し、活用するための技能とノウハウを蓄積・提供している日立システム。業種や規模を問わず、お客様のビジネス基盤強化・企業価値向上をサポートします。
- 企画特集
今注目の「サジェスト検索」−デモ掲載中
ロリポップ!がリニューアル
ESBでIT投資の無駄を劇的に解消する
インターネット上の悪意を未然に防ぐには?
そのストレージで仮想化に対応できますか?
ストレージメディア特設サイト開設
パンデミック対策特集
中小企業のセキュリティリスクとは?
【徹底対談】運用管理ツールの賢い使い方
集積度も性能も、業界最高水準のブレードPC
仮想環境を実現するソリューション特集
セキュリティ&ユーザ事例【SIer Club】
SOA、BPM、SaaS −今、企業に必要なこと
◆エン・ジャパン厳選求人☆毎週更新◆
御社のログ活用しませんか!?
- ■ストレージ容量50%削減保証■
- サーバー監視・運用のコストを削減するには
- エンタープライズにおけるSUSEの強み
- サービス・ドリヴン・データセンター
- 話題のタグ
小技
Google
Linux
OS
Windows 7
Ajax
Mozilla
プログラミング言語
ソフトウェア開発
PHP
Java
CSS
開発環境
Microsoft
UI
RIA
JavaScript
Internet Explorer
iPod touch
Database
オープンソース
Safari
Adobe
リファレンス
Flash
Tips
iPhone
Mac OS X
Webデザイン
SOA
WebKit
Chrome
アプリケーション
セキュリティ
Windows Vista
Firefox 3
モバイル
ツール
iPhone 3G
データベース
Off Topic
Webサービス
ブラウザ
HTML
Firefox
Opera
Apple
Windows
脆弱性
仮想化
話題のタグを見る »
Windows 7はLinuxへの切替が簡単:注目の仮想ディスクフォーマット「VHD」
iPhone OS 3.0で変わった「絵文字」
OSSのクラウド基盤「Eucalyptus」を使う(4)--インストール〜ノード構築
俳優経験者が指南する「人前で上手く話すためのティップス10選」
「うるまでるびペイント」登場:絵は上手下手ではなく制作過程に楽しみが
待てば回路の日和あり--「iPhone 3GS」発売、しかし――