ポインタ
メモリアドレスを保持し、それを通じてデータにアクセスできる機構
関連
raw pointer
純粋にメモリアドレスを保持するやつ
C言語の文脈で「ポインタ」と言ったらこれを指す
smart pointer
メモリ管理の仕組みを備えたポインタ
#wip
モチベーション
大きいデータのコピーのコストを下げる
ポインタがないと、大きいデータを丸々コピーする必要がある
code:c
struct Big {
char data1000000;
};
void f(struct Big b) {
...
}
code:c
f(big);
しかし、ポインタがあれば8バイトのアドレスを渡すだけで済む
code:c
void f(struct Big* b) {
}
元のデータを直接変更できる
値渡しでは呼び出し元は変わらない
code:c
void inc(int x) {
x++;
}
ポインタを使うと元データを書き換えられる
code:c
void inc(int* x) {
(*x)++;
}
動的メモリという概念そのものがポインタ前提
下記のようなmalloc()の返り値は、確保されたメモリの先頭アドレス以外に返しようがない
code:c
int* p = malloc(sizeof(int));
ヒープ領域を扱うなら、ポインタの存在が必須になる
リストなどのデータ構造を作るため
OSやハードウェアと直接やり取りするため
関数ポインタ
関数の情報がメモリ上に保存される
こことかに出てきた
https://github.com/ZeroIntensity/pointers.py
Pythonでポインタ地獄をやるやつ