このコードがあるとします:
int * p = 7;
f(p);
printf(p);
関数 f を書き、3 行目が 0 を出力するようにします。
私は単に p=0 と言いたかったのですが、関数内のアドレスがより広い範囲のアドレスと同じになるとは思わないので、これをよく理解している人に少し助けてもらいたいだけです。
ありがとう!
質問の訂正
int *p
は整数へのポインタであるため、数値を割り当てることはできません。あなたの質問が正しいと理解できれば、関数内で変更するにはポインターの値が必要です。
void function (int *p)
{
int i = 0;
if(NULL == p)
{
printf("Input argument is NULL");
return;
}
/* Change the value of the pointer */
*p = i;
}
この関数は、次のように呼び出すことができます。
int main()
{
int i = 3;
function (&i);
printf("i=%d\n",i);
return 0;
}
コードの説明:
関数にポインターを渡すと、実際にはポインター変数のコピーが作成され、元のポインターと同じアドレスを指します。ポインターのコピーは、function()
終了後にスコープを失いますが、変更する予定のアドレスの値が変更されます。
通常、人々はポインター値として望んでいない7
ので、おそらくあなたが望む変数はint num = 7;
void f(int* pNum) {
*pNum = 0;
}
int main() {
int num = 7;
f(&num);
printf("%d",num);
return 0;
}
ただし、既存のコードと同じ構文を使用したい場合は、
void f(int * p) {
strcpy(p,"0");
}
int main() {
int * p = malloc(2); // let's change to valid address
f(p);
printf(p);
return 0;
}