ポインタ_(プログラミング)
[Wikipedia|▼Menu]
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%;font-size:90%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}html.client-js body.skin-minerva .mw-parser-output .mbox-text-span{margin-left:23px!important}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}

この記事は検証可能参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方
出典検索?: "ポインタ" プログラミング ? ニュース ・ 書籍 ・ スカラー ・ CiNii ・ J-STAGE ・ NDL ・ dlib.jp ・ ジャパンサーチ ・ TWL(2017年2月)

ポインタ (: pointer) とは、コンピュータプログラミングにおいて、変数定数サブルーチン(関数)などが置かれたメインメモリ上の番地(メモリアドレス)を格納するための特殊な変数のこと[1][2]。あるオブジェクトがなんらかの論理的位置情報に基づいてアクセスできるとき、それを参照する(指し示す)ためのものである。一般的な意味での「ポインタ」は「何かの位置を指し示すための仕組みや道具」のことであり、転じてコンピュータプログラミングの分野ではメモリアドレス参照の意味で使われるようになった。
概要

コンピュータのメモリ空間(memory space)は番地(アドレス)と呼ばれる通し番号で管理される[3]。コンピュータがプログラムを実行する際は、プログラムに含まれる変数や定数、オブジェクトの実体(インスタンス)、サブルーチン[注釈 1]などはそれぞれのデータ型および命令数などに基づいたサイズを持ち、何らかのアドレス値をもってメモリ空間上に配置される。このアドレス値を格納するための変数がポインタである。

アセンブリ言語のような低水準言語ではない)高水準言語において、数値型(例えばCにおけるint型やdouble型)のような、ポインタではない型の変数は、そこに整数や小数といった値を格納するための入れ物であり、その配置場所がメモリ上のどのアドレス(番地)であるかは、取り立てて必要のない限りは意識しなくて済む仕様となっている。一方、この配置場所を値として格納するための変数がポインタである。

厳密にいうと、ポインタではない型の変数の場合も、変数自身が内部的に持つのは整数や小数の値そのものではなくその配置場所のアドレスである。ただしこのアドレス参照は高水準言語のプログラムコード上では隠蔽される。一方のポインタ変数では、値の配置場所のアドレスが格納されていることが高水準言語のコード上でも現れる。なお、レジスタベースのマシンでは、一部のローカル変数はスタックメモリではなくレジスタに直接割り付けられることもある。その場合、メモリ空間上には配置されない[注釈 2]。レジスタはごく少量だが高速な作業領域で、プロセッサの命令やそのオペランド、演算結果といったデータを一時的に格納するなどの目的で使用される。スタックポインタやプログラムカウンタ(インストラクションポインタ)のように、アドレスを指し示す専用レジスタも存在する。

ポインタという仕組みは、操作対象の位置を表すメモリアドレス値を直接参照したり書き換えたりすることができるため、ハードウェア寄りの操作や制御を行うのには都合が良い[1]。その反面、実行時に不正な値を入力されるようなことが起きると、プログラマが予期していなかった位置のデータやコードを読み書きしてしまう場合があり、深刻なバグ、しかもセキュリティの脆弱性となってしまうような深刻なバグがしばしば発生する[1]。→#問題点

多くのプログラミング言語においてポインタあるいはポインタに類する機能を利用できるが、C/C++に言語機能として実装されたポインタが特に有名である。なお、C++には、ポインタとは独立した類似の言語機能として、「参照」がある(#参照の節を参照)。

プログラムコード中では「ptr」と略されることも多い。
C言語のポインタ.mw-parser-output .side-box{margin:4px 0;box-sizing:border-box;border:1px solid #aaa;font-size:88%;line-height:1.25em;background-color:#f9f9f9;display:flow-root}.mw-parser-output .side-box-abovebelow,.mw-parser-output .side-box-text{padding:0.25em 0.9em}.mw-parser-output .side-box-image{padding:2px 0 2px 0.9em;text-align:center}.mw-parser-output .side-box-imageright{padding:2px 0.9em 2px 0;text-align:center}@media(min-width:500px){.mw-parser-output .side-box-flex{display:flex;align-items:center}.mw-parser-output .side-box-text{flex:1}}@media(min-width:720px){.mw-parser-output .side-box{width:238px}.mw-parser-output .side-box-right{clear:right;float:right;margin-left:1em}.mw-parser-output .side-box-left{margin-right:1em}}ウィキブックスにC言語関連の解説書・教科書があります。

最も典型的なポインタの例としては、C言語におけるポインタが挙げられる。C言語のポインタは「特定のメモリ領域を指し示す」ものである。ポインタを経由してメモリ上のデータにアクセスする際、参照するデータの型に応じたポインタ型を用いる。たとえば、int型のデータにアクセスする場合は、int*型を用いる。int*型を持つ変数を「intへのポインタ」(pointer to int[5]) と呼ぶ。

C言語にポインタが存在する理由は、効率上の問題である。C言語は、元々UNIXを記述するシステム用言語として開発されたものである。したがって、アセンブラが実行できる操作のほぼ全てを行える必要があった。そのため、特定のメモリ領域への値の直接代入能力を持つなど、他のプログラミング言語と比較すると異色とも言える強力なポインタ機能を備えている。

C言語の実行モデルでは、実行プログラム上の関数コード、データが全て1次元のアドレスに直列配置される。そのため、データはおろか、関数のアドレスを取得し、他の関数にエントリーポイント情報として渡すこともできる。

また、C言語の関数では、引数は、値渡しだけをサポートし、参照渡しをサポートしない。これは、アドレスの数値を取得すれば、参照に可能な全てを行えるため、実質的に参照を数値と同一視できるからである。実際、初期のC言語では、アドレス値は、整数型互換するものとして扱われていた。これは、値と参照を明確に区別するPascalなどとは対照的である。@media screen{.mw-parser-output .fix-domain{border-bottom:dashed 1px}}現在[いつ?]でもC言語は、void*により任意のメモリ領域にアクセスできる。なお後発のC++では参照渡しもサポートするようになった。

しかし、コード領域も含むメモリを直接扱えるということは、言語レベルでは(意図的でないとしても)不正なメモリアクセスを事実上保護できないということを示しており、C言語のプログラムにおけるポインタ関連のバグの多さがそれを証明している。
実際の例

一般的なC言語のソースコードでは、ポインタが指している領域の値を参照する間接演算子 (indirection operator) "*"と、アドレス演算子 (address operator) "&"を用いて記述される。未初期化のポインタ変数は、不定の領域を指している。しかし、その場合、「未初期化状態」と「有効な領域を指している状態」の区別がつかない。そのため、Null(ヌル)値を代入することによって、ポインタが無効な領域を指していることを明示する必要がある。
単純なポインタ


宣言例

/* int型変数 n を宣言 */int n;/* intへのポインタ型変数 ptr を宣言 */int *ptr;/* int型変数 n のアドレスをポインタに代入 */ptr = &n;

アスタリスク*前後のスペースの有無は任意である。

上記の2つの変数nとptrは、以下のようにまとめて宣言することもできるが、混乱を招く恐れがある[6]。/* intへのポインタ型変数 ptr と、int型変数 n を宣言 */int *ptr, n;

複数のポインタ変数をまとめて宣言する場合は、以下のように書く必要がある。int *ptr0, *ptr1;


何も指していないポインタ(ヌルポインタ

C言語の処理系では通例、無効なポインタを示す値として下記のようなNULLマクロが定義されている。#define NULL ((void*)0)

C言語では、voidへのポインタは任意の型へのポインタに自由に代入することができる。ポインタに無効値を代入する場合、通例このNULLマクロを使う。int *ptr = NULL;

一方、C++では、NULLは整数定数のゼロに等しい。#define NULL 0

そのため、C++では下記のように書くこともできる。int *ptr = 0;

C++ではNULLが整数定数のゼロに等しいことから起こる関数オーバーロードのルックアップに関する問題を解決するため、C++11以降では、std::nullptr_t型として評価されるキーワードnullptrが定義された。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:45 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef