ポインタ型【pointer type】
概要

コンピュータはデータをメインメモリ(RAM)上に配置して管理しており、各データには固有のアドレスが割り当てられている。通常の変数が「値そのもの」を保持するのに対し、ポインタ型の変数(ポインタ変数とも呼ばれる)は「その値が存在する場所」を保持する。住所録に書かれた住所のようなもので、住所録を見れば目的の場所へたどり着けるように、ポインタを参照すれば目的のデータへアクセスできる。
C言語では、変数のメモリアドレスを取得するために「&」演算子を使用し、ポインタが指すアドレスの値を参照するために「*」演算子(間接参照演算子)を使用する。例えば、整数型の変数 x のアドレスを格納するポインタは int *p = &x; のように宣言し、*p と記述することで x の値に間接的にアクセスできる。
ポインタ型が特に有用なのは、大きなデータ構造を関数へ渡す場面や、動的メモリ管理を行う場面である。データそのものをコピーして渡す代わりにアドレスだけを渡すことで、処理効率が向上する。また、malloc などの関数を用いてプログラム実行中にメモリを動的に確保する際も、確保された領域のアドレスをポインタ型の変数に代入して受け取る。連結リストや木構造といった動的なデータ構造も、ポインタによってノード間をつなぐことで実現される。
一方、ポインタの誤用はプログラムの深刻な不具合につながる。例えば、初期化されていないポインタを参照する「未初期化ポインタ」、解放済みのメモリを参照し続ける「ダングリングポインタ」、確保したメモリを解放し忘れる「メモリリーク」などの問題が生じることがある。こうした扱いの難しさから、JavaやPythonなどの高水準言語ではポインタを直接操作する仕組みを持たず、メモリ管理を実行系(ランタイム)に委ねる設計が採用されている。