为什么x打印出1,2,3,4而不是4,3,2,1。当我打印input [0]时,它说4.数组不应该通过引用传递吗?因此,我可以使用x来指代最初是x的输入?顺便说一下,这是C ++。 这不是另一个问题的重复。如果我在rev listo中打印出阵列,则可以正确打印。问题在于数组可以在main函数中调用。
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;
}
答案 0 :(得分:5)
在内部,当您执行void rev_listo(int input[], int num)
时,将传递指向数组第一个元素的指针(只是为了避免复制数组)。
赞:
void rev_listo(int *input /* = &(arr[0])*/, int num)
请注意,input
指针本身是按值复制的,而不是按引用复制的。
因此,执行此操作时,end_list
的第一个元素的地址将复制到input
指针。:
input=end_list;
函数结束时,指针input
死亡。
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.
您不仅应该像这样分配指针:input=end_list;
,还应该手动复制数组。像这样:
for(int x = 0; x<num; x++){
input[x] = end_list[x];
}
答案 1 :(得分:3)
该数组是否已通过引用传递?
不。仅当参数的类型是引用类型时,参数才是引用。对类型T
的引用声明如下:T&
。您会发现参数声明中没有&
。您已声明该参数为指向整数的指针。
尽管参数声明看起来像一个数组(大小丢失),但实际上不是数组。参数不能具有数组类型。声明为数组的参数被调整为指向该数组元素的指针。您的函数声明等效于void rev_listo(int *input, int num)
。
为什么x打印出1,2,3,4
因为该函数不会修改参数input
所指向的数组元素。它仅修改本地数组end_list
和本地指针input
。
P.S。声明int end_list[num];
在C ++中格式错误,因为num
不是编译时间常数。
答案 2 :(得分:0)
为避免在合法占用的内存位置上进行重写;仅迭代一半大小。例如
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;
}