2

こんにちは、Cプログラミング言語の初心者です。最近、値による呼び出しとアドレスによる呼び出しについて読みました。呼び出された関数のアドレス変更による呼び出しでは、呼び出し先が反映されることを学びました。ただし、次のコードはそのようには機能しません。

int x = 10,y = 20;
void change_by_add(int *ptr) {
    ptr = &y;
    printf("\n Inside change_by_add\t %d",*ptr);
    // here *ptr is printing 20
}

void main(){
    int *p;
    p = &x;
    change_by_add(p);
    printf("\nInside main\t %d", *p);
    // here *p is still pointing to address of x and printing 10
}

アドレスを渡すときに、呼び出された関数によって行われた変更が呼び出し元を反映しないのはなぜですか?

4

4 に答える 4

2

関数はポインターに新しいアドレスを割り当てていますが、すべての引数が C にあるため、ポインター自体は値渡しされています。ポインター変数の値を変更するには、ポインター自体のアドレスを渡す必要があります。

void change_by_add(int **ptr)
{
    *ptr = &y;
}

change_by_add(&p);

C FAQ の質問 4.8を参照してください。

参照渡しは C には存在しませんが、値を変更する変数のアドレスを関数に渡すことで実現できます。例えば:

void add_to_int(int* a_value, int a_increment)
{
    *a_value += a_increment;
}
于 2014-04-25T11:23:12.737 に答える
2

ポイントされた変数の値ではなく、関数内のポインターの値を設定しているだけです。関数は次のコードを使用する必要があります。

*ptr = y;

これにより、ポインターが参照解除されます (ポイントされた値が公開されます)。したがって、等号演算子を使用すると、ポインター自体ではなく、ポイントされたメモリが変更されます。これが物事を明確にするのに役立つことを願っています。

于 2014-04-25T11:23:42.610 に答える