C / c ++ポインタパラメータの受け渡しの例

私は2年生です。プログラミングを1年間学んでいます。ブログの形でテクノロジーを皆さんと共有したいと思います。何か問題があれば、皆さんに訂正してもらいたいと思います。
今日、先輩の一人がポインタ受け渡し値の変更について聞いてきました。今日、兄が尋ねた質問をコードであなたと共有することにしました。

ナンセンスな話をやめて、コードを入手しましょう。
1)最初のケースでは、関数パラメーターはポインターであり、値はこのように割り当てられます

void test(int * arr){ int a = 3;

arr = &a;

}

int main(void){

int value = 0;
int *arr = &value;

printf("函数调用前:*arr=%d\n",*arr);
//test(arr);
printf("函数调用后:*arr=%d\n",*arr);


system("pause");
return 0;
}
大家觉得这个value传入前后值是否会改变,答案当然是不会改变!
好让我们看看在vs2010上的执行情况

ここに画像の説明を挿入します

2)ここで、test()関数のパラメーターポインターが一時関数で作成された新しいポインターであることに気付きました。このように、ポインターの割り当て、つまりテスト関数のarrポインター= arrと同等です。メイン関数内のポインタ、割り当て後、割り当て操作が実行されます。実際、割り当て操作はこの一時ポインタに対してすでに実行されており、元のメイン関数ポインタとは関係ありません。
したがって、パラメータを渡して入力値を変更する場合は、このメソッドを使用できます。
アドレス文字を追加するだけで、結果は大きく異なります。

void test(int *&arr){ int a = 3; arr =&a;

}

int main(void){

int value = 0;
int *arr = &value;

printf("函数调用前:*arr=%d\n",*arr);
//test(arr);
printf("函数调用后:*arr=%d\n",*arr);
system("pause");
return 0;
}

ここに画像の説明を挿入します

3)arrの値が変更されていることを確認しました。test()関数のパラメーターは、現時点ではメイン関数のコピーではなくなっているためです。それらは両方とも同等です。
実際、別の遊び方があります。参照を追加せず
にarrの値を変更できます。また、値の値を変更することできます
。voidtest(int * arr){ int a = 3;

*arr = a;

}

int main(void){

int value = 0;
int *arr = &value;

printf("函数调用前:*arr=%d\n",*arr);
printf("函数调用后:*value=%d\n\n",value);
test(arr);
printf("函数调用后:*arr=%d\n",*arr);

printf("函数调用后:*value=%d\n",value);

system("pause");
return 0;
}
我们看下在vs2010的执行情况

ここに画像の説明を挿入します

なぜこれが起こるのですか?ここでのサブ関数のarrもメイン関数のコピーですが、なぜそれがarrの値を変更し、値の値を変更できるのですか?これは、サブ関数内で* arr = a ;実際には値の値を直接操作します!
今日のポインター共有は以上です。ご不明な点がございましたら、お気軽にお問い合わせください。

おすすめ

転載: blog.csdn.net/weixin_45825875/article/details/108412033