理解函数中的指针(引用值)

understanding pointers in functions (referring values)

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 的未初始化值。编译器不是 "smart"。它假设您会做正确的事情,并通过取消引用 c 为 z 分配一个值(您确实这样做了)。

为什么像我在 (1) 中那样引用指针值是正确的,但在下面的代码中是错误的

关于你的第二个问题,第一个例子是有效的,因为函数的参数被初始化为你调用函数时使用的任何值。 第二个示例不起作用,因为您使用的是未初始化的局部变量。

在变量被声明的地方,它存在于一些内存位置,可以用 & 检索,而(如果你不初始化它) 内容 该位置未初始化。当 zint 时,&z 是一个明确定义的指针,因为它是变量的地址,而不是变量的内容。当 z 是一个 int * 时,z 的内容本身就是一个指针,但它没有被初始化;因此警告(并且很可能,当 scanf() 尝试写入任意内存位置时,您的程序将崩溃)。

你的问题表明你对指针一无所知,我建议你先阅读它们,

一个指针指向一个变量,当你这样做时

*c = a

您正在尝试使用间接运算符“*”为 c 指向的变量赋值,

问题是 c 没有指向代码中的任何内容。

在第二个

d = &a;

你让指针d指向a。换句话说,您将 a 的地址分配给 d。你真的应该先阅读指针,否则,无论我们在这里说什么对你来说都没有意义。