为什么不通过引用传递数组?

时间:2019-02-11 00:43:10

标签: c++

为什么x打印出1,2,3,4而不是4,3,2,1。当我打印input [0]时,它说4.数组不应该通过引用传递吗?因此,我可以使用x来指代最初是x的输入?顺便说一下,这是C ++。 这不是另一个问题的重复。如果我在rev listo中打印出阵列,则可以正确打印。问题在于数组可以在main函数中调用。

using namespace std;

void rev_listo(int input[], int num)
{
    int end_list[num];

    for (int x = 0; x<num; x++) {
        end_list[x]=input[num-x-1];
        // cout<<end_list[x]<<endl;
    }
    // std::cout<<input<<std::endl;

    input=end_list;
    cout<<input[0]<<endl;
}

int main() {
    int x [4];
    x[0]=1;
    x[1]=2;
    x[2]=3;
    x[3]=4;

    rev_listo(x,  4);

    for(int y = 0; y<4; y++) {
        std::cout<<x[y]<<std::endl;
    }

    return 0;
 }

3 个答案:

答案 0 :(得分:5)

在内部,当您执行void rev_listo(int input[], int num)时,将传递指向数组第一个元素的指针(只是为了避免复制数组)。

赞:

void rev_listo(int *input /* = &(arr[0])*/, int num)

请注意,input指针本身是按值复制的,而不是按引用复制的。 因此,执行此操作时,end_list的第一个元素的地址将复制到input指针。:

input=end_list;

函数结束时,指针input死亡。

void rev_listo(int input[], int num)
{

    int end_list[num];

    for(int x = 0; x<num; x++){
       end_list[x]=input[num-x-1];
    //cout<<end_list[x]<<endl;
    }
   // std::cout<<input<<std::endl;

    input=end_list;
   cout<<input[0]<<endl;
} // input pointer dies here. So does num.

您不仅应该像这样分配指针:input=end_list;,还应该手动复制数组。像这样:

for(int x = 0; x<num; x++){
   input[x] = end_list[x];
}

答案 1 :(得分:3)

  

该数组是否已通过引用传递?

不。仅当参数的类型是引用类型时,参数才是引用。对类型T的引用声明如下:T&。您会发现参数声明中没有&。您已声明该参数为指向整数的指针。

尽管参数声明看起来像一个数组(大小丢失),但实际上不是数组。参数不能具有数组类型。声明为数组的参数被调整为指向该数组元素的指针。您的函数声明等效于void rev_listo(int *input, int num)

  

为什么x打印出1,2,3,4

因为该函数不会修改参数input所指向的数组元素。它仅修改本地数组end_list和本地指针input


P.S。声明int end_list[num];在C ++中格式错误,因为num不是编译时间常数。

答案 2 :(得分:0)

为避免在合法占用的内存位置上进行重写;仅迭代一半大小。例如

void revvings(int *d, int size) {
    int dh = (int)size/2;
       for(int i=0; i<dh; ++i) {
       int df = d[i];
       int dl = d[size-1-i];
       d[i]        = dl;
       d[size-1-i] = df;
    }
}

#include <cstdio>

int main() {
    int size = 7;
    int *d = new int[size];
    d[0] = 0; d[1] = 1; d[2] = 2; d[3] = 3; d[4] = 4; d[5] = 5; d[6] = 6;
    for(int i=0; i<size; ++i) printf("{%d} ", d[i]);
    puts("");    
    revvings(d, size);
    for(int i=0; i<size; ++i) printf("{%d} ", d[i]);
    puts("");




    return 0;
}