int *bubble_sort(int[]);
void main()
{
int arr[10]={ 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
printf("n%dn",bubble_sort(arr));
int *p = bubble_sort(arr);
printf("nprinting sorted elements ...n");
for(int i=0;i<10;i++)
printf("%dn",p[i]);
return 0;
}
int *bubble_sort(int a[])
{
int i,j,temp;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(a[j]>a[j+1])
{
temp = a[j];
a[j]=a[j+1];
a[j+1] = temp;
}
}
}
printf("%d",a);
return a;
}
在主函数中,我调用了bubble排序,它返回数组的基本位置并打印该位置。即使它指向相同的内存位置,仍然会打印两次地址。请分享你对这种行为的看法。待分析的线";printf("\n%d\n&",bubble_sort(arr((">
在函数外部和函数内部打印的地址将相同。它是arr
、&arr[0]
-中第一个元素的地址,它将在程序中打印三次。
- 您调用
bubble_sort
两次,因此bubble_sort
内部的打印将被打印两次 - 您在
main
中打印一次地址 - 因此:2+1=3
一些问题:
void main()
不是有效的main
签名。应返回int
for(j=0;j<10;j++)
和a[j+1]
使程序具有未定义的行为。当j
为9
时,您对a
的访问越界printf("%d", a);
和printf("n%dn",bubble_sort(arr));
还使程序具有未定义的行为,因为您为%d
转换说明符提供了地址。使用%p
打印指针的值- 你的循环比必要的要多。在一个值具有"0"之后;起泡";,你不需要反复检查
- 不需要调用
bubble_sort
两次
建议更改:
#include <stdio.h>
int* bubble_sort(int a[], int length) { /* take the length as an argument */
int i, j, temp;
for(i = 0; i < length; i++) { /* 0 up to 9 */
for(j = length - 1; j > i; j--) { /* 9 down to i + 1 */
if(a[j] < a[j - 1]) {
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
printf("in bubble_sort: %pn", (void*)a); /* %p to print pointers */
return a;
}
int main(void) {
int arr[10] = {10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
int* p = bubble_sort(arr, sizeof(arr) / sizeof(arr[0])); /* call once only */
printf("in main: %pn", (void*)p); /* %p to print pointers */
printf("nprinting sorted elements ...n");
for(int i = 0; i < 10; i++) printf("%dn", p[i]);
return 0;
}
可能输出:
in bubble_sort: 0x7ffc91ff68d0
in main: 0x7ffc91ff68d0
printing sorted elements ...
7
9
10
12
23
23
34
44
78
101
要回答为什么要打印2次(实际上是3次(地址
来自下方的代码
int arr[10]={ 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
printf("n%dn",bubble_sort(arr));
int *p = bubble_sort(arr);
函数对bubble_sort()
有两次调用-请注意,您也在打印bubble_sort()
函数中的数组地址。这三个地址都指向arr[]的开头。
因此3次地址打印来自
- 2次来自线路
printf("n%dn",bubble_sort(arr));
(一次来自printf
,另一次来自于bubble_sort(arr)
功能调用( int *p = bubble_sort(arr);
起1次