int main ()
{
int a, b;
call(&b);
printf("%d, %d",a , b);
}
void call(int *ptr)
{
}
期望的输出:
50, 100
如何编写调用函数以便修改这两个变量以获得所需的输出??
答案 0 :(得分:2)
不确定值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);
}
答案 1 :(得分:1)
虽然我们正在探索可以实现此输出的多种方式,但请考虑该函数可以将状态存储在静态变量中:
#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;
}
答案 2 :(得分:0)
尝试这样的事情:
void call(int *ptr)
{
*ptr = 100;
}
int main ()
{
int a, b;
a = 50;
call(&b);
printf("%d, %d",a , b);
}
请参阅demo
答案 3 :(得分:0)
也许你想要这个:
int main ()
{
int a, b;
call(&a, &b);
printf("%d, %d",a , b);
}
void call(int *ptr1, int *ptr2)
{
*a = 50;
*b = 100;
}
答案 4 :(得分:0)
要通过调用函数a
来更改函数b
中的局部变量,您有两个选择。
1)让函数b
返回一个赋值给函数a
中的变量的值。像:
int b() {return 42;}
void a()
{
int x = b();
printf("%d\n", x);
}
然而,这似乎并不是你想要的。
2)将指向变量的指针传递给函数b
,并通过该指针
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);
}
答案 5 :(得分:0)
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;
}