利用者:ザな/sandbox
ここはザなさんの利用者サンドボックスです。編集を試したり下書きを置いておいたりするための場所であり、百科事典の記事ではありません。ただし、公開の場ですので、許諾されていない文章の転載はご遠慮ください。
登録利用者は自分用の利用者サンドボックスを作成できます(サンドボックスを作成する、解説)。 その他のサンドボックス: 共用サンドボックス | モジュールサンドボックス 記事がある程度できあがったら、編集方針を確認して、新規ページを作成しましょう。 |
ポインタあるいはポインター(pointer)は、 コンピュータで処理するデータやプログラムの場所を記憶して指示するレジスタや変数の分類や呼称。 [1] [2]
概要
[編集]コンピュータは処理対象のデータと処理内容であるプログラムとを、一定の規則で記憶装置に並べて処理を行う。 記憶装置の特定の場所を指示すため、(現在のコンピュータの多くは)連続した整数のアドレス(Address)、番地を1バイト単位で割当てている。またプロセッサの内部にもレジスタと呼ばれる記憶場所を、数個から数10個程度配置している。レジスタや記憶装置の中身は全て有限桁ビット列のデジタル数値であるが、特にアドレス指定のための数値を記憶するレジスタや、記憶装置での特定アドレス(==高級言語での特定変数)を、ポインタと呼んで区別している。
命令セットでのポインタ
[編集]プログラムはInstructionとも呼ばれるコンピュータやプロセッサに対応した命令を処理順序に従って並べることで実現されている。 並べた命令を自動的に実行するために、プログラムカウンタ、Program Counter(PC)とも呼ばれるレジスタが用いられる。 プログラムカウンタは、現在実行中(あるいは次に実行予定の)命令のアドレスを記憶していて、次の命令に遷移する際に自動的に命令サイズ分だけ加算される。 プログラムには、条件分岐やループといった処理も必要になる。 これらはジャンプ等の命令を実行することで、間接的にプログラムカウンタの値をジャンプ先のアドレスに書換えることで実施される。プログラムカウンタは命令ポインタ、Instruction Pointer(IP)と呼ぶ場合もあり、場所を指示するポインタの1つである。
高級言語が利用されプログラムが大規模で複雑になると、プログラムを分割して作成管理利用するようになる。 分割されたプログラムは、言語によってサブルーチン(Subroutine)やプロシージャ(Procedure)、関数(Function)やメソッド(Method)などと呼ばれる。 これらの実現には、引数の受渡し、戻り値の受渡し、呼出し先へのジャンプ、呼出し元へのジャンプなどが必要になるが、多くの場合スタックと呼ばれるLIFO(Last In, First Out)のデータ構造を利用して実現している。スタック先頭を示すレジスタが用意される場合もあり、Stack Pointer(SP)などと呼ばれ、これもポインタの1つである。
データ転送命令は、記憶装置からレジスタへコピーするロード(Load)や、レジスタから記憶装置へコピーするストア(Store)などがある。レジスタの指定はプロセッサに対応したレジスタの固有名で行えるが、記憶装置の指定はアドレスを指定する必要がある。アドレス指定方法はプロセッサで異なるが、あるレジスタの記憶内容とオフセット値で指定するなどがある。
サブルーチンやプロシージャ、関数、メソッドなどと呼ばれる"手続き"も必要になる。手続きを実現するためには、命令のジャンプだけでなく、
プログラムカウンタ以外にも、ベースポインタやスタックポインタなど、アドレスを記憶するポインタ用のレジスタを用意しているプロセッサやコンピュータもある。
コンピュータの扱う数値に符号化された命令は命令コードともよび、処理内容であるオペレーションコード(Operation Code)と、処理対象であるオペランド(Operand)、被演算子から成る。オペランドの指定方法として、即値(Immediate)やレジスタ値などに加えて、直接アドレスや
データについても同様に、アドレスを指示して行う必要がある。あるレジスタに対象となるアドレスをセットするもの、レジスタで指示されたアドレスの内容が別のアドレスを指示するもの、などがある。
データ構造でのポインタ
[編集]コンピュータの記憶装置は利用者が
- ^ ブライアン・カーニハン、デニス・リッチー『プログラミング言語C』共立出版。ISBN 4-320-02692-6。
- ^ ブライアン・カーニハン、ロブ・パイク『プログラミング作法』アスキー出版。ISBN 4-7561-3649-4。
- ^ https://riscv.org/technical/specifications/
- ^ https://developer.arm.com/documentation/ddi0487/latest/
- ^ https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html"