int main()
{
int a, b;
call(&b);
printf("%d, %d",a , b);
}
void call(int *ptr)
{
}
所望の出力:ある関数のローカル変数を他の関数から変更する方法は?
所望の出力を得るために、変数の両方を変更するように呼び出し関数を記述する方法50, 100
?
int main()
{
int a, b;
call(&b);
printf("%d, %d",a , b);
}
void call(int *ptr)
{
}
所望の出力:ある関数のローカル変数を他の関数から変更する方法は?
所望の出力を得るために、変数の両方を変更するように呼び出し関数を記述する方法50, 100
?
int main()
{
int a,b;
call(&b);
printf("%d, %d\n", a,b);
}
int call(int *ptr)
{
int *m;
m = ptr++;
*ptr = 50;
*m = 100;
}
これは本質的に私が提供したのと同じ解決策であり、私の後に投稿されましたが、私は**未定義の動作**を引き起こすことを強調するために大きな苦労をしていました。そのような答えを提供する人は、これを指摘する責任があります。 –
このような何か試してみてください:
void call(int *ptr)
{
*ptr = 100;
}
int main()
{
int a, b;
a = 50;
call(&b);
printf("%d, %d",a , b);
}
たぶん、あなたはこの希望を参照してください:
int main()
{
int a, b;
call(&a, &b);
printf("%d, %d",a , b);
}
void call(int *ptr1, int *ptr2)
{
*a = 50;
*b = 100;
}
ない値50
と100
がどこから来ているか、あなたが正確にわからを尋ねるが、おそらくこれがあなたの質問に役立つだろう。
Cは、あなたが実際には別の関数内で値を変更するには、ポインタを送信する必要がある値渡しされているので。
call
機能を使用すると、値を変更する前にポインタを間接参照する必要がポインタ値を持つことになりますので。ここで
は一例です:
void call(int *a, int *b)
{
*a = 50;
*b = 100;
}
int main()
{
int a, b;
call(&a, &b);
printf("%d, %d\n", a, b);
}
次の2つのオプションがありb
関数を呼び出すことによって機能a
内のローカル変数を変更します。
1)機能を使用すると、機能a
に変数に割り当てる値を返すb
してみましょう。 Like:
int b() {return 42;}
void a()
{
int x = b();
printf("%d\n", x);
}
これは、あなたが探しているものではありません。私たちは、この出力を達成することができた多くの方法を模索していますが、機能は状態を保存することができることを考える
void b(int* p) // Notice the * which means the function takes a pointer
// to integer as argument
{
*p = 42; // Notice the * which means that 42 is assigned to the variable
// that p points to
}
void a()
{
int x;
b(&x); // Notice the & which means "address of x" and thereby
// becomes a pointer to the integer x
printf("%d\n", x);
}
2)b
に機能し、そのポインタを通じて変数を変更する変数へのポインタを渡します静的変数:
#include <stdio.h>
void call(int *ptr);
int main(void)
{
int a, b;
call(&a);
call(&b);
printf("%d, %d\n",a , b);
}
void call(int *ptr)
{
static int store = 0;
store += 50;
*ptr = store;
}
プログラムの出力:
50, 100
main()
に何も変更することなく、次のようにすることもできます。しかし、このメソッドは未定義のビヘイビアを呼び出すことに注意してください!配列オブジェクトの終端を越えた場所に書き込むための未定義の動作であり、a
とb
の場合には、これらは、ここでは、この書き込みが動作すると仮定し、そのされているサイズ1の配列オブジェクトであると考えられていますa
およびb
は、互いに隣り合ってメモリに記憶される。さらに、a
がメモリ内のより高いアドレスを有すると仮定する。
あなたはこれをしてはいけないと言いますが、a
のアドレスを知らずにcall()
の機能からa
を変更する方法は他にありません。あなたは警告されています。
void call(int *ptr)
{
*ptr = 100;
*(ptr + 1) = 50;
}
@ user3639779--私はあなたが 'main()'を変更せずにこれを実行できるメソッドを追加しました。 –
のでcall' 'に両方の変数を渡します。 –
@ YuriyIvaskevychあなたは変数へのポインタを意味しました、そうですか? –
これは、関数にパラメータがある理由です。 –