将一个数组分配给另一个数组 c++

24

你好,我是C++的初学者,有人可以解释一下这个吗?

char a[]="Hello";

char b[]=a; // is not legal 

然而,

char a[]="Hello";

char* b=a; // is legal 
如果一个数组不能被复制或赋值给另一个数组,那么为什么可以将其作为参数传递,而在方法中总是会对传递的值进行复制?

如果一个数组不能被复制或赋值给另一个数组,那么为什么可以将其作为参数传递,而在方法中总是会对传递的值进行复制?

void copy(char[] a){....}

char[] a="Hello";

copy(a);

它是“按引用传递”。 - Ahmed Hamdy
1
有关数组的奇怪规则是从1970年代的C编程继承而来的,由于太多现有代码会出问题,因此从未更改过。相反,在C++中,您被劝阻使用数组;而应该使用std::vector,它具有大多数高级语言中数组的行为。 - M.M
这篇回答很长,但是它值得一读。你的所有问题都在里面得到了解答。 - Praetorian
2
@AhmedHamdy,这不是传递引用。数组会衰减为指针,该指针被复制到函数的参数中,本质上等同于具有参数char *a。将其称为传递引用与实际通过引用传递参数(即它具有&)相冲突。 - chris
2个回答

18

它并不是复制数组,而是把它转换成指针。如果你修改它,你就会看到:

void f(int x[]) { x[0]=7; }
...
int tst[] = {1,2,3};
f(tst); // tst[0] now equals 7

如果需要复制一个数组,请使用std::copy

int a1[] = {1,2,3};
int a2[3];
std::copy(std::begin(a1), std::end(a1), std::begin(a2));

如果你发现自己在这样做,你可能想使用一个std::array


std::array和示例中使用的数组有什么区别? - Spark

8

在函数声明中,数组会被隐式地转换成指针并进行复制。当然,复制后的指针指向与原始指针相同的位置,因此您可以通过函数中的复制指针修改原始数组中的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接