0

I'm a programming student and I don't understand what is the problem with this code:

    #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()

And terminal shows me the following mistake

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

The purpose of this program is to show a sorted array.

1
  • Tell us what this line is supposed to do in your own words, as much detail as possible: printf("%d\n", &arr[i]); Commented Sep 15, 2011 at 22:24

5 Answers 5

9

Here:

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

It should be

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

because you want to print the actual element of the array arr[i], and not its address &arr[i].


Notice the difference between scanf and printf . In scanf you are supposed to provide the address (explanation, why), while in printf the actual value.

Sign up to request clarification or add additional context in comments.

Comments

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

arr is an array of integers
arr[i] is an integer
&arr[i] is a pointer

The printf specifier "%d" 'wants' an integer, not a pointer. Try

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

Comments

3

You need the & in the scanf() line; you do not need it in the printf() line.

You pass the address of the variable to scanf(); you pass the value arr[i] to printf().


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

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

Would you explain why?

With scanf(), the function needs to modify the variables in the calling function, but since C passes arguments by value, that won't work; therefore, you have to pass pointers to the variables so that scanf() can write to the variables via the pointer.

By contrast, when you are printing the values, the pass-by-value mechanism is perfect; you supply the value to be printed, and printf() cannot accidentally modify the variable in the calling function. The & is the 'address of' operator, of course. To print a simple integer (such as i), you'd write printf("%d\n", i);, wouldn't you? The same applies to arrays: arr[i] is an integer value like i is an integer value. So, to pass the integer value to printf(), write:

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

1 Comment

sorry.. would you explain why?
2

Well the warning says it all, &arr[i] is not an int but a pointer to an int. Did you intend arr[i] instead?

Comments

1

In your printf near the end, you have

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

arr[i] is an int; &arr[i] is a pointer to it.

Lose the &.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.