Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 引用数组涉及的技术细节_C++_Arrays_Reference - Fatal编程技术网

C++ 引用数组涉及的技术细节

C++ 引用数组涉及的技术细节,c++,arrays,reference,C++,Arrays,Reference,我为这个项目写了这个代码。我的编译器给我以下错误-[error]将“a”声明为引用数组。有什么问题 void repfunc(int& a[],int size){ for(int i=size-1;i>=0;--i){ if(a[i]==0){ a[i]=1; return; } for(int j=i-1;j>=0;--ji){

我为这个项目写了这个代码。我的编译器给我以下错误-[error]将“a”声明为引用数组。有什么问题

void repfunc(int& a[],int size){

    for(int i=size-1;i>=0;--i){

            if(a[i]==0){
                a[i]=1;
                return;
            }

        for(int j=i-1;j>=0;--ji){

            if(a[i]==a[j]&&a[i]!=9){
                ++a[i];
                a[i]%=10;
                return;
            }
            else if(a[i]==a[j]&&a[i]==9){
                a[j-1]++;
                a[j-1]%=10;

                    FOR(k, 1,size-j){
                        a[k]=k;
                    }

                return;
            }
        }

    }

}

正如错误所说,您不能拥有引用数组。看起来您实际上是在尝试通过引用传递数组。您可以(某种程度上)通过将其更改为获取指向数组开头的指针来实现这一点:

void repfunc(int a[], int size)  // equivalent to "int * a"
由于数组可转换为指针,因此如果参数是数组,则这样做是正确的

int a[4] = {1,2,3,4};
repfunc(a, sizeof a / sizeof a[0]);
或者,您可以接受对正确大小数组的引用:

template <size_t size>
repfunc(int (&a)[size])

但是请注意,只有当
a
实际上是一个数组时,这才有效;不是,例如指向动态分配数组的指针。

C++标准8.3.2/4明确指出: 不应有引用、引用数组和引用指针 实际上,引用必须总是引用某个东西-没有空引用这样的东西。这就是为什么不能有引用数组,因为无法将数组中的引用默认实例化为有意义的值。 -消息来源是 也可以通过指针算术访问原始数组。所以,如果我们想支持引用数组,我们必须支持指向引用的指针,按照标准,这是不可能的。 这就是无法使用引用数组的原因。这就是你所做的。正如迈克·西摩所说:
void repfunc(int a[],int size)
非常适合您的情况。

您不能拥有引用数组,这就是问题所在(引用不是对象)。为什么不呢?那我该怎么办呢?要找出原因,请按照我上面评论中的。向下滚动至答案。关于“我该做什么”,你仍然有两个数组可供选择——对象数组和指针数组。那么,我如何将数组传递给一个函数,该函数可以编辑数组,而不声明数组为全局数组呢?@Paranix:的确,我已经加了一条注释。小心,
sizeof a
在这方面有误导性。@Soumadepsaha:No,这是一个自动数组;如果您使用
new
,它是动态的,在这种情况下,您只有一个指针,而不是数组本身。如果您传递一个指针,将对数组进行更改,因为指针指向数组。@soumadepsaha
int-array[a]
如果
a
不是常量,则不会编译。@soumadepsaha:某些编译器接受变长数组作为非标准扩展。如果您想编写可移植代码,请不要使用它们。
int a[4] = {1,2,3,4};
repfunc(a);