引用数组涉及的技术问题

Technicalities involved with array of references

本文关键字:技术 问题 数组 引用      更新时间:2023-10-16

我为以下问题编写了这段代码。我的编译器给出了以下错误-[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])

允许自动推断的大小

int a[4] = {1,2,3,4};
repfunc(a);

但请注意,这仅在CCD_ 1实际上是阵列的情况下有效;而不是,例如指向动态分配的数组的指针。

C++标准8.3.2/4明确指出:

不应有对引用的引用,不应有引用数组,也不应有指向引用的指针

实际上,引用必须总是引用某个东西——没有空引用这样的东西。这就是为什么不能有引用数组的原因,因为没有办法将数组中的引用默认实例化为有意义的值。-来源在这里

并且通过指针算术访问By origin数组。所以,如果我们想支持引用数组,我们必须支持指向引用的指针,这是不可能的。这些就是引用数组不可能的原因。这就是你所做的

正如Mike Seymour提到的:void repfunc(int a[], int size)完全适合您的情况。