C++ 为什么不是';是否通过引用传递数组?

C++ 为什么不是';是否通过引用传递数组?,c++,C++,为什么x打印出的是1,2,3,4而不是4,3,2,1。当我打印输入[0]时,它显示为4。数组不应该通过引用传递吗?所以我可以用x来指代最初是x的输入?这是C++的方式。 这不是另一个问题的重复。如果我在rev listo中打印出数组,它将正确打印。问题在于数组在主函数中是可调用的 using namespace std; void rev_listo(int input[], int num) { int end_list[num]; for (int x = 0; x<

为什么x打印出的是1,2,3,4而不是4,3,2,1。当我打印输入[0]时,它显示为4。数组不应该通过引用传递吗?所以我可以用x来指代最初是x的输入?这是C++的方式。 这不是另一个问题的重复。如果我在rev listo中打印出数组,它将正确打印。问题在于数组在主函数中是可调用的

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;
 }
使用名称空间std;
void rev_listo(int-input[],int-num)
{
int end_list[num];

对于(int x=0;x内部,当执行
void rev_listo(int input[],int num)
操作时,将传递指向数组第一个元素的指针(以避免复制数组)

像这样:

void rev_listo(int *input /* = &(arr[0])*/, int num)
for(int x = 0; x<num; x++){
   input[x] = end_list[x];
}
请注意,
输入
指针本身是按值复制的,而不是按引用复制的。 因此,当您执行此操作时,
end_list
的第一个元素的地址被复制到
input
指针:

input=end_list;
当函数结束时,指针
输入
消失

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.
数组不应该通过引用传递吗

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

尽管参数声明看起来像一个数组(缺少大小),但它实际上不是数组。参数不能具有数组类型。声明为数组的参数将调整为指向此类数组元素的指针。您的函数声明相当于
void rev_listo(int*input,int num)

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

因为函数不修改参数
input
指向的数组元素。它只修改本地数组
end\u list
,以及本地指针
input



S.EngEntEng[num;[nUM]; >在C++中是不正确的,因为<代码> num < /C>不是编译时常数。

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

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;
}
void revings(int*d,int size){
int dh=(int)size/2;

对于(int i=0;I.不能在C中传递数组),代码> int(输入)[]/COD>实际上使<代码>输入<代码>指针。C++中不允许代码> int EndoList[num;)。可变长度数组是C的东西。
令人困惑。我可以建议
I
?另外,尽管一些糟糕的教科书说,
使用名称空间std;
转储名称空间。你不应该这样做。我很困惑。你是说rev_listo()中循环内的print语句打印错误,主循环打印正确吗?@anatolyg如果我在rev listo函数中打印数组,它会反向打印。