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件)
- ホワイトペーパー
- 企画特集
- 話題のタグ
仮想化
java
脆弱性
Windows Vista
php
Webサービス
Mac OS X
Microsoft
Flash
iPhone 3G
リファレンス
UI
Database
Firefox 3
開発環境
マイクロソフト
Off Topic
Safari
オープンソース
iPhone
Windows
Chrome
CSS
javascript
ブラウザ
HTML
Apple
google
プログラミング言語
WebKit
小技
セキュリティ
アプリケーション
クラウド
Ajax
RIA
ソフトウェア開発
OS
linux
Tips
iPod touch
Internet Explorer
Firefox
Mozilla
インストール
Windows XP
Windows 7
Webデザイン
Opera
データベース
話題のタグを見る »
SQLite対応アプリのデータベースファイルを閲覧する
グーグル、「Google Buzz」を発表--Gmailのソーシャル機能を強化
「H.264」ストリーミングのロイヤリティ無料期間が延長
マイクロソフト、「Office 2010」のRC版をリリース
利用者の理想を追求した最新レンタルサーバ
仮想化をダメにするストレージの実態
新しい視点のレンタルサーバが誕生!
Xbox Live インディーズゲーム開発の軌跡
通販サイトのアクセス集中からの危機を救う
御社はまだフリーの転送サービスですか?
事例 VMwareでデータセンターをクラウド化
経営統合後の事業損益構造の見える化を実現
アンケートから見るセキュリティ対策の実態
身近な業務をCRMが変革!
仮想環境のバックアップは難しいのか
レガシーアプリケーションの稼働どうしてる?
DBのパフォーマンスに困ってませんか?
アプリケーション仮想化 3つの課題