C/C++のポインタの機能--参照渡しののような処理
沖林正紀
2008/03/27 17:00
ポインタは、それに特化した内容の書籍も発刊されているほど、C/C++言語の最も特徴的な機能だ。配列とも深い関係を持つその機能を紹介しよう。
ポインタとは
ポインタはC/C++言語の最も特徴的な機能といえるもので、ポインタ変数と呼ばれるもので操作する。ポインタ変数の配列を宣言することもできる。また、多次元配列のように、ポインタのポインタというものも存在する。
このページをお読みいただいている読者にあっては、「C言語 ポインタ」「C++ ポインタ」などのキーワードでWeb検索をしたことがあるかもしれない。そうするとポインタに特化した内容の書籍をいくつか見つけられる。それだけ奥が深い機能ということである。
ポインタの用途
では、ポインタはどんなところで使われているのだろう。C/C++言語では、main以外にあらかじめ利用可能になっている関数が多数存在するが、その一覧には、*(アスタリスクあるいはアステリスク)が書かれているものをよく見かける。
これらはポインタ変数を表し、主に文字列の操作やファイルをはじめとするデータの入出力を行う関数において、ポインタの機能を利用することを表している。
ポインタ変数の宣言
ポインタ変数の宣言では、一般の変数の場合とは異なり、名称の先頭に*がつけられる。以下はnというポインタ変数を宣言する例である。ここでは、*nが表す値のデータ型はintとなるが、それ以外のデータ型でポインタ変数を宣言すれば、*nはその型の値を表すことになる。
int *n; /* int型の値を表すポインタ変数nの宣言 */ int n; /* 一般の変数 n を宣言する場合 */
続いて、*nを使って処理に用いる値を代入し、それを出力する例を示す。このときnには代入された値を記憶した場所(アドレス)が自動的に代入されるため、nそのものの値は実行されるごとに異なる可能性があるものの、*nが表す値は、処理中に変更されない限り5のままである。
#includeint main( void ) { int *n; *n = 5; /* ポインタ変数nに値5を代入 */ printf( "%d\n", *n ); /* ポインタ変数nが持つ値(5)の出力 */ return 0; }
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15個の連載記事が公開中)
- 3件のコメント
#2 mohno
- 2008/03/28 03:12:43
すでに指摘されていますが、筆者の方はポインタを理解されていないと思います。
「参照渡し」も実際にはポインタを値で渡しているのですし、&を使って変数をポインタ変数に変えたりできるのではありません。
« サマリに戻る
» 不適切なコメントを報告する
「参照渡し」も実際にはポインタを値で渡しているのですし、&を使って変数をポインタ変数に変えたりできるのではありません。
#3 tomita
- 2008/03/28 18:57:30
builder編集部 冨田です。
prometheusさん、mohnoさん、コメントありがとうございました。
著者の沖林さんからは、
「 ご指摘をいただいた賢明な読者の方々に感謝します。
表現が短絡的に過ぎ、結果として読者の方々に誤解を
与えてしまったのかもしれません。 」
とのコメントを頂きました。
また、沖林さんと編集部で相談し、記事を下記のように修正しました。
タイトル「C/C++のポインタの機能--参照渡し」
↓
タイトル「C/C++のポインタの機能--参照渡しののような処理」
1ページ目
見出し「ポインタ変数の宣言」の個所
「ポインタ変数を宣言する例を以下に示す。一般の変数の場合とは異なり、名称の先頭に*がつけられる。このポインタ変数が持つ値のデータ型はintだが、それ以外のデータ型でポインタ変数を宣言することもできる。」
↓
「ポインタ変数の宣言では、一般の変数の場合とは異なり、名称の先頭に*がつけられる。以下はnというポインタ変数を宣言する例である。ここでは、*nが表す値のデータ型はintとなるが、それ以外のデータ型でポインタ変数を宣言すれば、*nはその型の値を表すことになる。」
「ポインタ変数に値を代入し、それを出力する例を示す。*nは一般の変数と同じように用いることができるのがお分かりいただけるだろう。」
↓
「*nを使って処理に用いる値を代入し、それを出力する例を示す。このときnには代入された値を記憶した場所(アドレス)が自動的に代入されるため、nそのものの値は実行されるごとに異なる可能性があるものの、*nが表す値は、処理中に変更されない限り5のままである。」
2ページ目
見出し「ポインタ変数の特徴」の個所
「2. 一般の変数を一時的にポインタ変数に変えることもできる」
↓
「2. 一般の変数からもアドレスを参照できる」
見出し「1. 変数には複数の記述方法がある」の個所
「つまり、*nはアドレスを介してプログラムで用いる値を参照していることになる。そのため、このような処理を参照渡しという。」
↓
「つまり、*nはアドレスを介してプログラムで用いる値を参照していることになる。C/C++においては、このようにアドレスの値を用いることで、参照渡しのように機能させることができるようになっている。」
「2. 一般の変数を一時的にポインタ変数に変えることもできる」
↓
「2. 一般の変数からもアドレスを参照できる」
「このとき&nは、一般の変数nを一時的にポインタ変数に変えていることを表している。このようにすることで、一般の変数でも参照渡しをできるようにしているのだ。」
↓
「この&nは、一般の変数nを用いて、その値が記憶されている場所(アドレス)を参照していることを表している。このときの&はアドレス演算子と呼ぶ。」
以上です。貴重なご意見、ありがとうございました。
今後もどしどしコメントを付けていただければ幸いです。
« サマリに戻る
» 不適切なコメントを報告する
prometheusさん、mohnoさん、コメントありがとうございました。
著者の沖林さんからは、
「 ご指摘をいただいた賢明な読者の方々に感謝します。
表現が短絡的に過ぎ、結果として読者の方々に誤解を
与えてしまったのかもしれません。 」
とのコメントを頂きました。
また、沖林さんと編集部で相談し、記事を下記のように修正しました。
タイトル「C/C++のポインタの機能--参照渡し」
↓
タイトル「C/C++のポインタの機能--参照渡しののような処理」
1ページ目
見出し「ポインタ変数の宣言」の個所
「ポインタ変数を宣言する例を以下に示す。一般の変数の場合とは異なり、名称の先頭に*がつけられる。このポインタ変数が持つ値のデータ型はintだが、それ以外のデータ型でポインタ変数を宣言することもできる。」
↓
「ポインタ変数の宣言では、一般の変数の場合とは異なり、名称の先頭に*がつけられる。以下はnというポインタ変数を宣言する例である。ここでは、*nが表す値のデータ型はintとなるが、それ以外のデータ型でポインタ変数を宣言すれば、*nはその型の値を表すことになる。」
「ポインタ変数に値を代入し、それを出力する例を示す。*nは一般の変数と同じように用いることができるのがお分かりいただけるだろう。」
↓
「*nを使って処理に用いる値を代入し、それを出力する例を示す。このときnには代入された値を記憶した場所(アドレス)が自動的に代入されるため、nそのものの値は実行されるごとに異なる可能性があるものの、*nが表す値は、処理中に変更されない限り5のままである。」
2ページ目
見出し「ポインタ変数の特徴」の個所
「2. 一般の変数を一時的にポインタ変数に変えることもできる」
↓
「2. 一般の変数からもアドレスを参照できる」
見出し「1. 変数には複数の記述方法がある」の個所
「つまり、*nはアドレスを介してプログラムで用いる値を参照していることになる。そのため、このような処理を参照渡しという。」
↓
「つまり、*nはアドレスを介してプログラムで用いる値を参照していることになる。C/C++においては、このようにアドレスの値を用いることで、参照渡しのように機能させることができるようになっている。」
「2. 一般の変数を一時的にポインタ変数に変えることもできる」
↓
「2. 一般の変数からもアドレスを参照できる」
「このとき&nは、一般の変数nを一時的にポインタ変数に変えていることを表している。このようにすることで、一般の変数でも参照渡しをできるようにしているのだ。」
↓
「この&nは、一般の変数nを用いて、その値が記憶されている場所(アドレス)を参照していることを表している。このときの&はアドレス演算子と呼ぶ。」
以上です。貴重なご意見、ありがとうございました。
今後もどしどしコメントを付けていただければ幸いです。
Topic: Windows Vista SP1がついに出荷開始
- 今日のトップ記事
- 昨日
- 2日前
- 3日前
- 4日前
- 7日前
- ホワイトペーパー
-
電子メールセキュリティガイド 〜電子メールセキュリティにおける15のよくある間違い〜すべての企業が埋めなければならないセキュリティホール
-
データセンタの電力容量増強に伴う隠れたコストの削減
-
■企業のコンプライアンス強化のためのデータ管理とは?「すべての企業情報を最適に保護する」ことが急務!
-
日本版SOX法を底辺から支えるクライアントPCのIT統制基盤ツール
〜クライアントPCをセキュアな状態に保ち、健全なIT環境を作るために〜
-
増え続けるファイルデータ。高まるデータ保護と事業継続への要求。データ可用性とデータ保護に優れ、かつコスト効率の高い分散型エンタープライズ環境を実現するためのヒントとは?
〜Brocade StorageXレプリケーション機能が可能にするリソース利用率の最適化とデータ保護
Power Center
- 話題のタグ
開発環境
iPhone
Firefox
Flash
Eclipse
Python
CSS
Leopard
Google
Webデザイン
JavaScript
Linux
SOA
iPod touch
Firefox 3
Off Topic
Ruby
入門
Vista
オープンソース
OpenID
ブラウザ
MySQL
小技
PostgreSQL
Safari
Database
IDE
Apple
XHTML
Tips
HTML
Webアプリケーション開発
PHP
Java
Windows
Ruby on Rails
ライブラリ
Mac OS X
server
イロハ
RIA
Microsoft
Apache
リファレンス
フレームワーク
仮想化
Mozilla
Ajax
C/C++
話題のタグを見る »
ポインタnはどこを指しているのでしょうか?