ポインタ (プログラミング)
そのため、データはおろか、関数のアドレスを取得し、他の関数にエントリーポイント情報として渡すこともできる。
また、C言語の関数では、引数は、値渡しだけをサポートし、参照渡しをサポートしない。これは、アドレスの数値を取得すれば、参照に可能な全てを行えるため、実質的に参照を数値と同一視できるからである。実際、初期のC言語では、アドレス値は、整数型互換するものとして扱われていた。これは、値と参照を明確に区別するPascalなどとは対照的である。現在でもC言語は、void*により任意のメモリ領域にアクセスできる。なお後発のC++では参照渡しもサポートするようになった。
しかし、コード領域も含むメモリを直接扱えるということは、言語レベルでは(意図的でないとしても)不正なメモリアクセスを事実上保護できないということを示しており、C言語のプログラムにおけるポインタ関連のバグの多さがそれを証明している。
なお、レジスタベースのマシンでは、一部のローカル変数はスタックメモリではなくレジスタに直接割り付けられることもある。その場合、メモリ空間上には配置されない。レジスタはごく少量だが高速な作業領域で、プロセッサの命令やそのオペランド、演算結果といったデータを一時的に格納するなどの目的で使用される。スタックポインタやプログラムカウンタ(インストラクションポインタ)のように、アドレスを指し示す専用レジスタも存在する。
ポインタという仕組みは、操作対象の位置を表すメモリアドレス値を直接参照したり書き換えたりすることができるため、ハードウェア寄りの操作や制御を行うのには都合が良い。その反面、実行時に不正な値を入力されるようなことが起きると、プログラマが予期していなかった位置のデータやコードを読み書きしてしまう場合があり、深刻なバグ、しかもセキュリティの脆弱性となってしまうような深刻なバグがしばしば発生する。→#問題点
多くのプログラミング言語においてポインタあるいはポインタに類する機能を利用できるが、C/C++に言語機能として実装されたポインタが特に有名である。なお、C++には、ポインタとは独立した類似の言語機能として、「参照」がある(#参照の節を参照)。
プログラムコード中では「ptr」と略されることも多い。