C++ 如何从函数访问数组元素
如果正在迭代的数组来自一个参数并在另一个作用域中声明,则foreach循环类型不起作用C++ 如何从函数访问数组元素,c++,arrays,for-loop,foreach,arguments,C++,Arrays,For Loop,Foreach,Arguments,如果正在迭代的数组来自一个参数并在另一个作用域中声明,则foreach循环类型不起作用 // C++ program to demonstrate use of foreach #include <iostream> using namespace std; void display(int arr[]) { for (int x : arr) cout << x << endl; } int main() {
// C++ program to demonstrate use of foreach
#include <iostream>
using namespace std;
void display(int arr[])
{
for (int x : arr)
cout << x << endl;
}
int main()
{
int arr[] = { 10, 20, 30, 40 };
display(arr);
}
<代码> //C++程序演示Frach的使用
#包括
使用名称空间std;
无效显示(int arr[])
{
用于(整数x:arr)
cout当你给一个函数一个C样式的数组时,你也需要给出它的大小,因为函数不知道数组的大小。数组参数
int x[]
被认为是数组第一个元素上的指针(因此类似于int*x
)。因此,函数无法判断数组有多大,因为它只有指针(第一个元素的地址)。您需要指定函数从提供的地址中读取多少int(或其他类型)以获得有效元素
#包括
使用名称空间std;
无效显示(int arr[],int nsize)
{
int i=0;
而(我 cout当你给一个函数一个C样式的数组时,你也需要给出它的大小,因为函数不知道数组的大小。数组参数int x[]
被认为是数组第一个元素上的指针(因此类似于int*x
)。因此,函数无法判断数组有多大,因为它只有指针(第一个元素的地址)。您需要指定函数从提供的地址中读取多少int(或其他类型)以获得有效元素
#包括
使用名称空间std;
无效显示(int arr[],int nsize)
{
int i=0;
而(我 cout第一段代码不起作用,因为
void display(int arr[])
实际上相当于
void display(int *arr)
您不能使用单个指针进行迭代,因为它没有任何长度信息。另请参阅
第二段代码之所以有效,是因为基于范围的中的范围表达式必须是
表示适当序列(定义了起始和结束成员函数或自由函数的数组或对象,请参见下文)或带括号的初始化列表的任何表达式
因此,它可以使用自由函数,而不是不存在的成员函数arr.begin()
和arr.end()
,这些函数对数组重载。第一段代码不起作用,因为
void display(int arr[])
实际上相当于
void display(int *arr)
您不能使用单个指针进行迭代,因为它没有任何长度信息。另请参阅
第二段代码之所以有效,是因为基于范围的中的范围表达式必须是
表示适当序列(定义了起始和结束成员函数或自由函数的数组或对象,请参见下文)或带括号的初始化列表的任何表达式
因此,它可以使用自由函数,而不是不存在的成员函数
arr.begin()
和arr.end()
,这些函数对于数组来说是重载的。首先,我建议您编辑@Ted在评论中提到的问题
我必须承认错误消息不是很直观。缺失的开始
和结束
的出现源自的定义。正如您所看到的,您正在传递一个未知大小的数组作为范围表达式,对吗?链接页面进一步说明了这种情况:
如果range_表达式是数组类型的表达式,则begin_expr为
__range and end_expr是(_range+_bound),其中_bound是数组中的元素数(如果数组大小未知或
类型不完整,程序格式不正确)
您的第二个代码段实际上使用了一个大小已知的数组,因为它的使用与其初始化在同一范围内。状态:
初始化未知大小的数组时,该数组的最大下标
指定的初始值设定项决定数组的大小
正在申报
让我为您提供一个标准库模板,以便更好地掌握数组。它是..err..std::array
:)。您得到的基本是值语义和与其他类型的一致性:
- 按值接受参数会复制整个内容
- 通过(const)引用接受参数有一个熟悉的语法
- 传递数组对象时,不会隐式丢失大小信息
#include <array>
#include <iostream>
using namespace std;
void display(const array<int>& arr)
{
for (int x : arr)
cout << x << endl;
}
int main()
{
std::array arr{ 10, 20, 30, 40 };
display(arr);
}
#包括
#包括
使用名称空间std;
无效显示(常量数组和arr)
{
用于(整数x:arr)
cout首先,我建议您编辑@Ted在评论中提到的问题
我必须承认错误消息不是很直观。缺失的开始
和结束
的出现源自的定义。正如您所看到的,您正在传递一个未知大小的数组作为范围表达式,对吗?链接页面进一步说明了这种情况:
如果range_表达式是数组类型的表达式,则begin_expr为
__range and end_expr是(_range+_bound),其中_bound是数组中的元素数(如果数组大小未知或
类型不完整,程序格式不正确)
您的第二个代码段实际上使用了一个大小已知的数组,因为它的使用与其初始化在同一范围内。状态:
初始化未知大小的数组时,该数组的最大下标
指定的初始值设定项决定数组的大小
正在申报
让我为您提供一个标准库模板,以便更好地掌握数组。它是..err..std::array
:)。您得到的基本是值语义和与其他类型的一致性:
- 按值接受参数会复制整个内容
- 通过(const)引用接受参数有一个熟悉的语法
- 传递数组对象时,不会隐式丢失大小信息
所以你的代码会发生在我身上
int arr[] = { 10, 20, 30, 40 };
for (int x : arr)
cout << x << endl;
template <typename T>
void display(std::vector<T> const & arr)
{
for (int x : arr)
cout << x << endl;
}
int main()
{
std::vector<int> arr { 10, 20, 30, 40 };
display(arr);
}
#include <iostream>
using namespace std;
void display(int * arr) // <-- notice int*
{
}
int main()
{
int arr[4] = {10, 20, 30, 40}; // <-- notice int[4]
display(arr);
}
int main()
{
int arr[] = { 10, 20, 30, 40 };
for (int x : arr)
cout << x << endl;
}
int main()
{
int arr[4] = {10, 20, 30, 40};
{
int (&__range1)[4] = arr;
int * __begin1 = __range1;
int * __end1 = __range1 + 4L;
for(; __begin1 != __end1; ++__begin1)
{
int x = *__begin1;
std::cout.operator<<(x).operator<<(std::endl);
}
}
}