C中的数组问题

时间:2011-09-15 22:22:00

标签: c arrays debugging pointers

我是一名编程学生,我不明白这段代码有什么问题:

    #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 *’

此程序的目的是显示已排序的数组。

5 个答案:

答案 0 :(得分:9)

下面:

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

应该是

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

因为您要打印数组arr[i]的实际元素,而不是其地址&arr[i]


注意scanfprintf之间的区别。在scanf中,您应该提供地址(explanation, why),而在printf中提供实际值。

答案 1 :(得分:5)

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

arr是一个整数数组 arr[i]是整数
&arr[i]是一个指针

printf说明符"%d"'想要'整数,而不是指针。尝试

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

答案 2 :(得分: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]);

答案 3 :(得分:2)

警告说这一切,&arr[i]不是int而是指向int的指针。您打算arr[i]代替吗?

答案 4 :(得分:1)

在你的printf附近,你有

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

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

失去&