Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
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のアドレスに変わる
}

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

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?