search
LoginSignup
4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

ポインタ渡しと戻り値でポインタを返す場合の違い

ポインタ渡しを理解したつもりでえらい勘違いをしてたので備忘録として書いておきます。
(自分の理解が足りてないのに、システムコールのせいになんかしてました。死にたい)

ポインタ渡し

ポインタ渡しは、渡されたアドレスをポインタとして参照して扱う。
渡されたアドレスを参照するポインタなので、その部分を留意して取り扱う。

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のアドレスに変わる
}

例えば、呼び出し元でポインタ自身のアドレスを渡した場合、呼び出し先でポインタのアドレスを変えると
呼び出し元の値(ポインタの指すアドレス)が変わる。

コメントでご指摘を頂いたので修正。
ただ、呼び出し元と同じアドレスを指しているので、呼び出し先で値を変更すると呼び出し元の値も変更される。
呼び出し先でアドレスを変えても、呼び出し元のアドレスは変わらない。(コピーのアドレスが変わってるだけだから)

戻り値としてポインタを返す

戻り値として返すので、当然ながらアドレスをそのまま受け取れる。
アドレスを指す先が、関数内のローカル変数だったら死んでるので注意。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4
Help us understand the problem. What are the problem?