проблема с массивом в C - PullRequest
0 голосов
/ 16 сентября 2011

Я студент-программист, и я не понимаю, в чем проблема с этим кодом:

    #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 ]

9 голосов
/ 16 сентября 2011

Здесь:

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

должно быть

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

потому что вы хотите напечатать фактический элемент массива arr[i], а не его адрес &arr[i].


Обратите внимание на разницу между scanf и printf. В scanf вы должны указать адрес ( объяснение, почему ), а в printf фактическое значение.

5 голосов
/ 16 сентября 2011
printf("%d\n", &arr[i]);

arr - массив целых чисел
arr[i] является целым числом
&arr[i] это указатель

Спецификатор printf "%d" «хочет» целое число, а не указатель. Попробуйте

printf("%d\n", arr[i]);
3 голосов
/ 16 сентября 2011

Вам нужно & в строке 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]);
2 голосов
/ 16 сентября 2011

Ну, предупреждение говорит само за себя, &arr[i] это не int, а указатель на int. Вы намеревались вместо arr[i]?

1 голос
/ 16 сентября 2011

В вашем printf ближе к концу у вас есть

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

arr[i] - это int;&arr[i] является указателем на него.

Потеряйте &.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...