C++函数地址传递练习中的问题

问题遇到的现象和发生背景

在学习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] << " ";
    }
}

img

请看👉 :C++中值传递、地址传递与引用传递