C++ 如何从函数访问数组元素

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() {

如果正在迭代的数组来自一个参数并在另一个作用域中声明,则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() 
{ 
    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);
    }
    
  }
}