【问题标题】:Technicalities involved with array of references涉及一系列参考文献的技术细节
【发布时间】:2013-11-27 13:48:58
【问题描述】:

我为following problem 编写了这段代码。我的编译器给了我以下错误- [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;
            }
        }

    }

}

【问题讨论】:

  • 你不能有一个引用数组,这就是问题所在(引用不是对象)。
  • 为什么不呢?我该怎么办?
  • 要找出原因,请关注我上面评论中的link。向下滚动到答案。关于“我该怎么做”,好吧,您仍然有两个数组可供选择 - 对象数组和指针数组。
  • 那么我如何将数组传递给可以编辑数组的函数,而不声明数组全局?

标签: c++ arrays reference


【解决方案1】:

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

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);

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

【讨论】:

  • @Paranaix:确实,我已经添加了一个注释。
  • 小心,sizeof a 在那里误导。
  • @SoumadeepSaha:不,这是一个自动数组;如果你使用new,它是动态的,在这种情况下你只有一个指针,而不是数组本身。如果您传递一个指针,则会对数组进行更改,因为这是指针指向的内容。
  • 如果a 不是常量,@SoumadeepSaha int array[a] 将不会编译。
  • @SoumadeepSaha:一些编译器接受可变长度数组作为非标准扩展。如果您想编写可移植代码,请不要使用它们。
【解决方案2】:

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

不能有引用的引用,不能有引用的数组,不能有引用的指针

实际上,引用必须始终引用某些东西——没有空引用这样的东西。这就是为什么不能有引用数组的原因,因为无法将数组内的引用默认实例化为有意义的值。 -来源是Here

并且还可以通过指针算术访问 By origin 数组。因此,如果我们想支持引用数组,我们必须支持指向引用的指针,按照标准这是不可能的。 这些是不可能引用数组的原因。你在做什么。

正如迈克·西摩所说: void repfunc(int a[], int size) 非常适合您的情况。

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多