在学习C++函数地址传递时,我的冒泡排序函数,运行后输出数组完全没有经过排序(原封不动),但是把排序算法放在main()函数中执行,就可以正常排序,所以不是算法问题。
_ascendingBubbleSort()_代码
void ascendingBubbleSort(int* a) {
for (int i = 0;i < sizeof(a) / sizeof(a[0]);i++) {
for (int j = 0;j < sizeof(a) / sizeof(a[0]) - 1;j++) {
if (i + 1 <= sizeof(a) / sizeof(a[0])) {
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
}
_main()_代码
int main() {
int a[] = { 2,6,4,9,0,1,7,3,5,8,11,-3 };
ascendingBubbleSort(a);
//排序算法放在这里就可以正常排序了
/*for (int i = 0;i < sizeof(a) / sizeof(a[0]);i++) {
for (int j = 0;j < sizeof(a) / sizeof(a[0]) - 1;j++) {
if (i + 1 <= sizeof(a) / sizeof(a[0])) {
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}*/
for (int i = 0;i < sizeof(a) / sizeof(a[0]);i++) {
cout << a[i] << " ";
}
}
2 6 4 9 0 1 7 3 5 8 11 -3 请按任意键继续. . .
没有头绪,我对比了教程的代码,也没发现有问题,望解答,please
排序函数能正常排序
i < sizeof(a) / sizeof(a[0])
在数组中这么写是不行的,sizeof(a)得不到数组长度,只能得到指针的大小。
数组作为参数时,实际是将指针作为参数,函数不知道这个数组长度,必须将数组长度用参数传递,所以要加一个长度参数才可以的
我仔细阅读了你的问题,程序代码是没问题的。代码没问题的情况下就是编译器的问题
下面是我的理解,供参考:
这个是因为在不同的地方传递参数a被认定为不同数据类型导致。
根据在ascendingBubbleSort()函数和在main函数打印sizeof(a)的数据,发现在两个函数处sizeof(a)的结果不一样,在ascendingBubbleSort()函数为8(这个是认定a为指针,64为机器int型指针占用8个字节),在main函数是48(这个因为是在同一个函数里,应该是认定a为数组),所以可以另外传递一个数组长度进去就可以了。
参考链接:
C语言指针变量内存大小,指针变量占用的内存空间大小说明_公幹氣褊的博客-CSDN博客
#include <iostream>
using namespace std;
void ascendingBubbleSort(int * a,int n) {
// printf("in ascendingBubbleSort ,sizeof(a) =%d, sizeof(a[0])=%d, sizeof(a) / sizeof(a[0]) - 1=%d\n",
// sizeof(a),sizeof(a[0]),
// sizeof(a) / sizeof(a[0]) - 1);
for (int i = 0;i < n;i++) {
for (int j = 0;j < n- 1;j++) {
// printf("sizeof(a) / sizeof(a[0]) - 1=%d,a[%d]=%d\n",sizeof(a) / sizeof(a[0]) - 1,j,a[j]);
if (i + 1 <= n) {
if (a[j] > a[j + 1]) {
//printf("a[%d]=%d,a[%d]=%d ,change it!\n",j,a[j],j+1,a[j+1]);
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
}
int main() {
int a[] = { 2,6,4,9,0,1,7,3,5,8,11,-3 };
// printf("in main ,sizeof(a) =%d, sizeof(a[0])=%d, sizeof(a) / sizeof(a[0]) - 1=%d\n",
// sizeof(a),sizeof(a[0]),
// sizeof(a) / sizeof(a[0]) - 1);
ascendingBubbleSort(a,12);
//排序算法放在这里就可以正常排序了
// for (int i = 0;i < sizeof(a) / sizeof(a[0]);i++) {
// for (int j = 0;j < sizeof(a) / sizeof(a[0]) - 1;j++) {
// if (i + 1 <= sizeof(a) / sizeof(a[0])) {
// if (a[j] > a[j + 1]) {
// int t = a[j];
// a[j] = a[j + 1];
// a[j + 1] = t;
// }
// }
// }
// }
for (int i = 0;i < sizeof(a) / sizeof(a[0]);i++) {
cout << a[i] << " ";
}
}