函数中的数组初始化
Array initialization in function
我有以下问题:假设我有一些类型为int
的函数f
。因此,当我f(a)
调用此函数时,发生的第一件事是函数中的新变量被声明int x=a;
这就是为什么如果有一个函数void f(int a){a++}
为某个变量调用该函数不会改变其值。
现在让我们假设有一个类型int array[5]
的函数。调用此函数时会发生什么情况?我问的原因是因为我读到如果函数尝试使用a
初始化其他数组,它将不起作用。
我想知道的另一件事如下。数组int a[5]
和int b[6]
会被视为具有不同的数据类型吗?
void f(int a[5])
具有误导性,因为它实际上是void f(int a[])
或void f(int *a)
。
要传递大小,您必须通过指针或引用传递数组:void f(int (&a)[5])
因此,void f(int a[5])
和void f(int b[6])
是相同的功能声明。
实际上没有将数组传递给函数(按值)的语义类似物,因为您将传递整数。这是因为数组类型不允许作为函数参数。
有一个句法类比:你确实可以写void(int[5])
但意思不同。此语法实际上与void(int*)
含义相同。换句话说,参数是一个指针。
我想知道的另一件事如下。数组 int a[5] 和 int b[6] 会被视为具有不同的数据类型吗?
int[5]
和int[6]
是不同的类型,是的。但是,在函数参数的声明中,语法int[5]
的含义不是类型int[5]
而是int*
。同样,语法int[6]
也具有类型int*
的含义。因此,在函数参数的声明中,并且仅在该上下文中,int[5]
和int[6]
确实意味着相同的类型:int*
。
数组类型(int[C]
)的表达式在作为参数传递时会自动转换为指向第一个元素(类型为int*
)的指针。这种转换称为数组衰减。因此,以下格式良好:
void foo(int[5]); // type of argument is int*
void bar() {
int arr[6]; // type of arr is not int*
foo(arr); // arr decays to int*
}
不复制阵列。执行数组到指针的转换,并将该指针复制为参数。因此,可以修改指针指向的对象。
该值将被更改,因为将发送数组的引用,而不是创建新的基元类型变量,如 int x=0 和 func(x);
发送数组时,值(如果在函数中更改)也将全局更改,因为它会更改引用指针的值。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组