私は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 ;実際には値の値を直接操作します!
今日のポインター共有は以上です。ご不明な点がございましたら、お気軽にお問い合わせください。