gpt4 book ai didi

C++ 基础 : ranged based for-loop and passing C-style arrays to functions

转载 作者:行者123 更新时间:2023-11-30 01:43:58 25 4
gpt4 key购买 nike

我正在尝试学习 C++,但我无法完全理解这段代码,尽管我花了很多时间寻找答案:

#include <iostream>

void printArray1(int (&array)[3]) {
for(int x : array)
std::cout << x << " ";
}

void printArray2(int array[]) {
for(int x : array) // compiler error, can't find begin and end
std::cout << x << " ";
}

int main() {
int a[3] = {34,12,88};

for(int x : a)
std::cout << x << " ";
std::cout << std::endl;

printArray1(a);
printArray2(a);
std::cout << std::endl;

return 0;
}

在 printArray1 中,我们接收到一个参数,该参数是对大小为 3 的数组的引用。这是否意味着我们正在接收整个数组的地址,或者我们只是接收到大小为 3 的数组中第一个元素的地址3?另外,这个参数是如何传递给循环的?

在 printArray2 中,我们接收到指向数组中第一个元素的指针,对吗?换句话说,我们也收到了一个地址,就像在 printArray1 中一样?因此,此函数中基于范围的 for 循环将无法编译,因为我们没有数组的大小数据,对吗?

最后,当我们尝试在 main 中使用基于范围的 for 循环进行打印时,我们到底向循环传递了什么?它是指向数组中第一个元素的指针吗?如果是,如果 printArray2 中的 for 循环不接受该指针,为什么它会编译?

我对 C++ 的了解还很初级,所以非常感谢您的帮助,谢谢!

最佳答案

基于范围的 for 循环适用于可与 std::beginstd::end 一起使用的所有类型。

数组和指针不一样。数组有固定大小,指针没有。因此 std::beginstd::end 适用于数组 - 但不适用于指针。这也解释了为什么基于范围的 for 循环适用于一个,但不适用于另一个。

数组也可能退化为指针。例如,当传递给采用指针参数的函数时,就会发生这种情况。或者,当传递给采用不确定大小的数组参数(实际上与指针参数相同)的函数时。发生这种情况时,尺寸信息会再次丢失。

所以这取决于你如何定义函数。第一个函数接受一个数组,第二个函数接受一个指针。这就是为什么第一个保留大小信息并且循环起作用的原因。

但是,它限制了函数可以接受的内容。第二个函数可以接受 int b[2],而第一个不能。

关于C++ 基础 : ranged based for-loop and passing C-style arrays to functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36973045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com