2014-10-17 109 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在功能您已經傳遞變量的地址,以該函數的功能。