ポインタ渡しを理解したつもりでえらい勘違いをしてたので備忘録として書いておきます。
(自分の理解が足りてないのに、システムコールのせいになんかしてました。死にたい)
ポインタ渡し
ポインタ渡しは、渡されたアドレスをポインタとして参照して扱う。
渡されたアドレスを参照するポインタなので、その部分を留意して取り扱う。
test.c
static int a;
void hoge(int** py)
{
//pyの値(参照先) = px自身のアドレス
//pyの参照先の値(pxの値)にaのアドレスが入った
*py = &a;
}
void main()
{
int* px = NULL;
hoge(&px);
//pxの参照先はaのアドレスに変わる
}
例えば、呼び出し元でポインタ自身のアドレスを渡した場合、呼び出し先でポインタのアドレスを変えると
呼び出し元の値(ポインタの指すアドレス)が変わる。
コメントでご指摘を頂いたので修正。
ただ、呼び出し元と同じアドレスを指しているので、呼び出し先で値を変更すると呼び出し元の値も変更される。
呼び出し先でアドレスを変えても、呼び出し元のアドレスは変わらない。(コピーのアドレスが変わってるだけだから)
戻り値としてポインタを返す
戻り値として返すので、当然ながらアドレスをそのまま受け取れる。
アドレスを指す先が、関数内のローカル変数だったら死んでるので注意。