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

时间:2015-02-07 21:47:02

标签: 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;
}

3 个答案:

答案 0 :(得分:1)

编译器警告我,z未初始化,但为什么工作版中没有问题?

编译器警告您z未初始化,因为您按值传递它。你传递的是一个未初始化的值(基本上是垃圾)。 当你传递z的地址时,它并没有警告你,因为将变量的地址传递给指针并没有错。编译器不会检查您是否要取消引用c并使用未初始化的z值。编译器不是那个" smart"。它假定你做的是正确的事情,只需通过解引用c(你确实这样做)来为z赋值。

为什么指向一个像我在(1)中所做的那样的值是正确的,但在以下代码中它是错误的

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

当你执行

时,指针指向一个变量
*c = a

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

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

在第二个

d = &a;

你使指针d指向a。换句话说,你指定一个地址。你真的应该首先阅读指针,不管我们在这里说什么对你都没有意义。