2015-02-07 82 views
2
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

只是一个提示,但你应该总是把二进制运算符之间的空间,如乘法。你不想碰到一个bug,并且意识到你实际上已经解引用了某些东西,只是因为'*'被视为一元解引用操作符。你的代码很简单,所以你现在不必担心,但如果它变得复杂,你可能会犯错误。 – Kacy 2015-02-07 22:08:05

+0

当我看到什么人投票下来,什么人投票在这里,它让我头痛 – Mcs 2015-02-07 22:11:16

回答

1

编译器警告我,是Z没有初始化,但为什么在工作版本中不是问题?

编译器会警告您有关z未初始化,因为您是按值传递它的。而你传递的是一个未初始化的值(这基本上是垃圾)。 当你传递z的地址时,它不会发出警告,因为将变量的地址传递给指针没有任何问题。编译器不检查你是否要解引用c,并使用z的未初始化值。编译器不是那么“聪明”。它假设你会做正确的事情,并通过取消引用c来分配一个值(你确实这样做了)。

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

至于你的第二个问题,第一个例子中的作品,因为功能的参数得到初始化为你称之为函数的任何值。 第二个示例不起作用,因为您使用的是未初始化的本地变量。

1

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

0

你的问题意味着你不知道指针的知识,我建议你第一次读到它们,

一个指针指向一个变量,当你做

*c = a 

你想分配值用间接运算符'*'由c指向的变量,

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

在第二个

d = &a; 

你使指针d点到。换句话说,你指定了d的地址。你真的应该首先阅读关于指针的内容,否则,无论我们在这里说什么都不会对你有意义。

+0

我的问题不是,为什么* c = a是错的,d =&a是正确的,我的问题是,为什么它是正确的) – pgz 2015-02-07 22:18:20

+0

请阅读你自己的问题,这是你的问题的一部分,无论如何,很明显你不知道什么是指针,提出一个问题并不坏,但首先阅读有关它们,似乎你不知道甚至不明白他们的目的 – Mcs 2015-02-07 22:19:52

+0

也关于你的关于z的问题,它不起作用,因为在C中你不能通过函数永久地改变变量的值,除非你通过指针来改变它, – Mcs 2015-02-07 22:22:25