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