int func (int a, int b, int *c);
int main()
{
int res, x, y, z; //int res, x, y, *z;
printf("enter x \n");
scanf("%i", &x);
printf("enter y \n");
scanf("%i", &y);
res = func(x, y, &z); //res = func(x, y, z);
printf("result addition: %i, result multiplication %i \n", res, *z);
return 0;
}
int func (int a, int b, int *c)
{
int result;
result = a +b;
*c = a*b; //(1) alternative:d=a*b
// c=&d
return result;
}
我的问题是,我不明白,为什么当我像在注释 (//) 中那样编写代码时它不起作用。编译器警告我, z 未初始化,但为什么在工作版本中这不是问题?
我不明白的另一件事是,为什么像我在(1)中所做的那样引用指针值是正确的,但在以下代码中是错误的:
int main()
{
int a, *c, *d;
scanf("%i", &a);
*c=a; //wrong
d=&a; //correct
return 0;
}
最佳答案
编译器警告我,z 未初始化,但为什么在工作版本中这不是问题?
编译器会警告您 z 未初始化,因为您按值传递它。你传递的是一个未初始化的值(基本上是垃圾)。 当您传递 z 的地址时,它不会警告您,因为将变量的地址传递给指针没有任何问题。编译器不会检查您是否要取消引用 c 并使用 z 的未初始化值。编译器只是没那么“聪明”。它假设您会做正确的事情,只需通过取消引用 c 来为 z 分配一个值(您确实这样做了)。
为什么像我在(1)中那样引用指针值是正确的,但在下面的代码中是错误的
对于你的第二个问题,第一个例子是有效的,因为函数的参数被初始化为你调用函数时使用的任何值。 第二个示例不起作用,因为您使用的是未初始化的局部变量。
关于c - 理解函数中的指针(引用值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387783/