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;
}
答案 0 :(得分:1)
编译器警告我,z未初始化,但为什么工作版中没有问题?
编译器警告您z未初始化,因为您按值传递它。你传递的是一个未初始化的值(基本上是垃圾)。 当你传递z的地址时,它并没有警告你,因为将变量的地址传递给指针并没有错。编译器不会检查您是否要取消引用c并使用未初始化的z值。编译器不是那个" smart"。它假定你做的是正确的事情,只需通过解引用c(你确实这样做)来为z赋值。
为什么指向一个像我在(1)中所做的那样的值是正确的,但在以下代码中它是错误的
至于你的第二个问题,第一个例子是有效的,因为函数的参数被初始化为你调用函数的任何值。 第二个例子不起作用,因为您使用了未初始化的局部变量。
答案 1 :(得分:1)
在声明变量的位置,它在某个内存位置存在,可以使用&
检索,而(如果您不初始化)内容那个位置的em>未初始化。当z
是int
时,&z
是定义良好的指针,因为它是变量的地址,而不是变量的地址。当z
是int *
时,z
的内容本身就是一个指针,但它没有被初始化;因此警告(当scanf()
尝试写入任意内存位置时,您的程序很可能会崩溃。)
答案 2 :(得分:0)
你的问题意味着你对指针一无所知,我建议你先阅读它们,
当你执行
时,指针指向一个变量*c = a
您正在尝试使用间接运算符'*'为
问题是c没有指向代码中的任何内容。
在第二个
d = &a;
你使指针d指向a。换句话说,你指定一个地址。你真的应该首先阅读指针,不管我们在这里说什么对你都没有意义。