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

标签 c pointers

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/

相关文章:

c - RSA 加密的 OpenSSL 可变长度结果 [C 编程]

c - 在 C 中的凯撒密码中使用 argc 和 argv

c - 查找二维数组中的重复元素

c - memcpy 将数组对象复制到 C 中的字符指针,反之亦然

c - 指向结构指针内字符串中的字符

C++:用于超重对象的方便的基于指针数组的值迭代器

C - 如何使用 grep 查找所有内部循环?

c - 修改 C 电话簿程序以返回匹配数组,而不仅仅是单个匹配

c - 使用结构取消引用指向不完整类型的指针

c - 返回类型为 void 的函数