我是一名编程学生,我不明白这段代码有什么问题:
#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 :(得分:9)
下面:
printf("%d\n", &arr[i]);
应该是
printf("%d\n", arr[i]);
因为您要打印数组arr[i]
的实际元素,而不是其地址&arr[i]
。
注意scanf
和printf
之间的区别。在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]
是指向它的指针。
失去&
。