C++ 引用数组涉及的技术细节
我为这个项目写了这个代码。我的编译器给我以下错误-[error]将“a”声明为引用数组。有什么问题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){
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
,它是动态的,在这种情况下,您只有一个指针,而不是数组本身。如果您传递一个指针,将对数组进行更改,因为指针指向数组。@soumadepsahaint-array[a]
如果a
不是常量,则不会编译。@soumadepsaha:某些编译器接受变长数组作为非标准扩展。如果您想编写可移植代码,请不要使用它们。
int a[4] = {1,2,3,4};
repfunc(a);