C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.
本FAQ分为五个部分:
如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.
在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用new和delete如下所示是非常危险的,但这是另一个常见问题解答的主题.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
考虑:
#include <iostream>
using namespace std;
void Change(int arr[3]) {
for (int i = 0; i < 3; i++) {
arr[i] = 1;
}
}
int Test() {
int arr[3] = { 0, 0, 0 };
for (int i = 0; i < 3; i++) {
cout << arr[i] << endl;
}
Change(arr);
for (int i = 0; i < 3; i++) {
cout << arr[i] << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
由于数组默认作为指向其第一个元素的指针传递并且不会被复制,因此在函数中更改数组元素的值实际上会导致在函数调用者中更改数组该元素的值,这就是为什么以上代码输出
#include <iostream>
using namespace std;
void Change(int …Run Code Online (Sandbox Code Playgroud) C++入门中的一个问题,当向量上的开始和结束工作我知道有vector :: size()可能会有所帮助,但是当我给出一个数组参数时它们是如何工作的.就像:
int arr[] = {1, 2, 3};
size = end(arr) - begin(arr);
Run Code Online (Sandbox Code Playgroud)
end(arr)和begin(arr)如何正常工作?
在内部,数组不保留除其包含的元素之外的任何数据(甚至不是它的大小,这是一个模板参数,在编译时固定).
我理解这意味着使用array类似于使用int[]和sizeof在相同的范围内.但这段代码是有效还是依赖于未定义的行为?
class A {
array<int, 10> arr;
void setArr() {
for (int& i : arr)
i = 42;
}
void printArr() {
for (int i : arr)
cout << i << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
编译器如何知道何时停止foreach而不将数组大小存储在堆或堆栈上?我运行它,代码工作.