默认情况下C++数组作为参数引用

C++ array as parameter reference by default?

本文关键字:参数 引用 数组 情况下 C++ 默认      更新时间:2023-10-16

原谅我问这么简单的问题,但我无法将SO或其他网站上以前的答案联系起来。我已经读过数组默认通过引用传递,而在其他地方我读到数组在传递到函数时衰减到指针。我正在尝试将数组传递给函数并对其进行修改,但无法协调前两个语句。我不确定我是否传递了指向toBin的指针或引用,以及它是否重要。以下代码是我尝试在 toBin 函数中更改b数组。

当我打印修改后的数组时,我得到一大堆意想不到的文本,比原始分配的大小为 11 的数组大得多,例如 1000000000 submarine blahblahblah .我的预期输出是 1000000000 .

void toBin(int x,char a[]){ //passed by reference by default
    std::cout << a << std::endl;
    for (int i=9;i>=0;i--){
        if(pow(2,i)<=x){
            x=x-pow(2,i);
            a[9-i]='1'; //i-1 because char b[] is zero indexed
        };
    }
}
int main()
{
    char c[]="submarine";
    double combination = pow(2,sizeof(c)-1);
    char b[11]={'0','0','0','0','0','0','0','0','0','0'};
    toBin(512, b);
    for (int i=0;i<combination;i++){
        std::cout << *(b+i) << std::endl;
    }
}

基本上,您将所有内容都传递给函数。破坏输出的东西是循环本身。

double combination = pow(2,sizeof(c)-1);
...
for (int i=0;i<combination;i++){
    std::cout << *(b+i) << std::endl;
}

您的combination变量的值可以像 2^8 一样。因此,您通过*(b+i)指向远远超出分配数组的地址。要修复它,您需要将循环更改为:

for (int i=0;i< sizeof(b);i++){