2014-10-17 88 views
-10

我应该使用一个函数为变量赋值初始值,但不明白为什么我的代码中的初始化函数没有初始化a,b,c,它会给出一些垃圾数。此外,我应该使用一个旋转函数使用变量a,b,c的静态声明,但由于它的静态它不交换变量。我如何做到这一点?初始化变量的函数C

void init(int num1, int num2, int num3); 

int main(void){ 

int a, b, c; 



init(a, b, c); 


printf("a=%d, b=%d, c=%d\n", a, b, c); 


rotate(); 

return 0; 
} 

void init(int num1, int num2, int num3){ 

printf("Enter value for num1: "); 
scanf("%d",&num1); 
printf("Enter values for num2: "); 
scanf("%d",&num2); 
printf("Enter values for num3: "); 
scanf("%d",&num3); 
} 


void rotate(void){ 
static int a,b,c; 
int temp; 
temp=a; 
a=b; 
b=c; 
c=temp;} 
+0

对于c你需要传递变量地址(指针)来从函数内初始化它们。 – 2014-10-17 16:53:49

+0

但我必须使用void init(int num1,int num2,int num3),而不是void init(int * num1,int * num2,int * num3),在这种情况下,我可以如何使用指针 – 2014-10-17 16:56:55

+0

这不会使很有道理。它被传递的价​​值;它不是*和你传递的相同'numN'。 – ChiefTwoPencils 2014-10-17 16:58:12

回答

6

你的函数正试图通过通过。
然而,在C,由地址传递非数组变量是允许的函数来改变它的唯一方式

您使用的函数参数可以纠正这样的...
更改功能:

void init(int *num1, int *num2, int *num3){ 

printf("Enter value for num1: "); 
scanf("%d",num1);//because argument is already a 
        //pointer, you do not need to de-reference (&) 
printf("Enter values for num2: "); 
scanf("%d",num2); 
printf("Enter values for num3: "); 
scanf("%d",num3); 
} 

而且,更改呼叫:

init(a, b, c); 

到:

init(&a, &b, &c); 
+0

谢谢,那么如何旋转函数声明静态var,我试过这个,但它不工作,我不应该采取参数旋转。 void rotate(){ static int a,b,c; int * temp,* p,* q,* r; p =&a; q =&b; r =&c; temp = p; p = q; q = r; r = temp; } – 2014-10-17 17:28:53

+0

你的函数rotate是原型为void void,这意味着它没有传递任何变量,并且它什么都不返回。而且,变量'a,b,c'只在该函数中有一个生命周期。它们与主函数中的'a,b,c'完全不同。 ***解决方法:***对我为init()函数描述的那个函数做同样的事情,即用'int *,...'原型,然后传递'&a,...'。 (并且在旋转函数中移除'int a ;;和others',因为它们将作为指针参数传递。 – ryyker 2014-10-17 17:37:30

0

将您的函数声明和定义更改为

void init(int *num1, int *num2, int *num3) 

并调用使用

init(&a, &b, &c); 

还能去除&所有scanf在功能您已经传递变量的地址,以该函数的功能。