2011-09-15 33 views
0

陣列我是一個編程的學生,我不明白這有什麼代碼問題:問題在C

#include <stdio.h> 
    #include <stdlib.h> 

    void merge(int a[], int low, int high, int mid){ 
     int i, j, k, c[50]; 
     i=low; 
     j=mid+1; 
     k=low; 
     while((i<=mid)&&(j<=high)){ 
      if(a[i]<a[j]){ 
       c[k]=a[i]; 
       k++; 
       i++; 
      } //end if 
     else{ 
      c[k]=a[j]; 
      k++; 
      j++; 
      } //end else 
     } //end while 
     while(i<=mid){ 
      c[k]=a[i]; 
      k++; 
      i++; 
     } //end while 
     while(j<=high){ 
      c[k]=a[j]; 
      k++; 
      j++; 
     } //end while 
     for(i=low;i<k;i++){ 
      a[i]=c[i]; 
     } //end for 
    } //end merge() 

    int mergesort(int a[], int low, int high){ 
     int mid; 
     if(low<high){ 
      mid=(low+high)/2; 
      mergesort(a,low,mid); 
      mergesort(a,mid+1,high); 
      merge(a,low,high,mid); 
     } //end if 
     return(0); 
    } //end mergesort() 

    int main(){ 
     int i, n, arr[100]; 
     do{ 
      scanf("%d", &n); 
      if(n == 0) 
       break; 
      else{ 
       for(i = 0; i < n; i++){ 
        scanf("%d", &arr[i]); 
        mergesort(arr, 0, n); 
       } //end for 
      } //end else 
      for(i = 0; i < n; i++) 
       printf("%d\n", &arr[i]); 
     }while(n != 0); //end while 
    } // end main() 

和終端顯示我以下錯誤

ej.c: In function ‘main’: 
ej.c:60:5: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’ 

的這個程序的目的是顯示一個排序後的數組。

+0

告訴我們這行代碼應該用你自己的話來做,儘可能多的細節:'printf(「%d \ n」,&arr [i]);' – Jon

+0

打印所有數組 –

回答

5
printf("%d\n", &arr[i]); 

arr是整數
arr[i]的陣列是一個整數
&arr[i]是一個指針

printf的說明符"%d" '想要' 的整數,不是指針。嘗試

printf("%d\n", arr[i]); 
2

嗯警告說,這一切,&arr[i]不是一個整數,但指針爲int。你打算用arr[i]代替嗎?

9

這裏:

printf("%d\n", &arr[i]); 

應該

printf("%d\n", arr[i]); 

,因爲你要打印的陣列arr[i]的實際元素,而不是它的地址&arr[i]


通知scanfprintf之間的差異。在scanf你應該提供的地址(explanation, why),而在printf的實際價值。

+0

謝謝你非常有幫助:) –

3

您需要在scanf()&;您不需要它在printf()行中。

您傳遞變量來scanf()地址;您將值arr[i]傳遞到printf()


scanf("%d", &arr[i]);  // Correct 

printf("%d\n", &arr[i]); // Incorrect 
printf("%d\n", arr[i]); // Correct 

你可以解釋爲什麼?

隨着scanf(),該功能需要修改調用函數的變量,但由於C已通過由值參數,這是行不通的;因此,您必須將指針傳遞給變量,以便scanf()可以通過指針寫入變量。

相比之下,當您打印值時,傳遞值機制是完美的;您提供要打印的值,並且printf()不會意外修改調用函數中的變量。當然,&是'運營商的地址'。要打印一個簡單的整數(如i),你會寫printf("%d\n", i);,不是嗎?同樣適用於數組:arr[i]是一個整數值,如i是一個整數值。所以,整數值傳遞給printf(),寫:

printf("%d\n", arr[i]); 
+0

對不起..你能解釋一下爲什麼嗎? –

1

在你printf接近尾聲,你有

printf("%d\n", &arr[i]); 

arr[i]int; &arr[i]是它的指針。

失去&