此问题在此处已有答案:
Why const char * and const char [] as function parameter are considered to be equivalent?(2个答案)
When a function has a specific-size array parameter, why is it replaced with a pointer?(3个答案)
What is array-to-pointer conversion aka. decay?(11个答案)
9天前关闭
有没有人能解释一下为什么这些功能是相同的?
void doubleArray(int* values, int length)
void doubleArray(int values[], int length)
字符串
我不需要改变任何东西,我的代码仍然完全一样的工作,但我不确定的逻辑。我希望必须改变什么是写在函数中的最低限度。完整的代码是下面如果需要的;
#include <iostream>
using std::cout;
using std::endl;
void doubleArray(int* values, int length);
int main() {
int length = 10;
int values[length];
for (int i = 0; i < length; i++){
values[i] = i;
}
doubleArray(values, length);
for (int i = 0; i < length; i++) {
cout << values[i] << endl;
}
}
void doubleArray(int* values, int length) {
for(int i = 0; i < length; i++){
values[i] = values[i] * 2;
}
}
型
3条答案
按热度按时间x4shl7ld1#
从https://en.cppreference.com/w/cpp/language/function#Parameter_list下载:
参数列表中每个函数参数的类型根据以下规则确定:
[..]
2)如果类型是“T的数组”或“T的未知边界的数组”,则将其替换为类型“指向T的指针”
[..]
由于这些规则,下面的函数声明声明完全相同的函数:
字符串
px9o7tmv2#
因为这是C的规则(它继承自C)。
C语言的设计者们认为将数组传递给函数是一个坏主意,他们认为传递一个指向数组第一个元素的指针更好,值得怀疑(在我看来)。
但他们也决定不想在函数参数声明中废除数组语法,所以他们决定,当用作函数参数时,数组形式
T param[]
只是指针形式T* param
的一种不同写法,甚至在为数组指定大小时也是一样的(这被忽略了),T param[10]
也是一个指针。更值得怀疑的是(在我看来)。在C中,你可以通过使用
std::vector
或std::array
来避免这一切,但在C中,你就没有那么幸运了。vfhzx4xs3#
假设我们声明了一个
int
的数组:字符串
在堆栈上分配了一个内存块,用于存储10个int,变量
values
包含该内存块的开始地址,或者换句话说,包含数组的第0个元素的地址,这是同一个东西。因此
型
永远都是真.
类似地,这两个语句都是针对同一个元素的
型
因此,如果我们有一个函数参数(或任何其他变量),它可以声明为
int*
或int[]
类型,并且两者都接受values
,因为这两种声明都只是声明同一事物(指针)的替代方式。这可能会造成混淆,因为对
foo()
的这两个调用都是有效的:型
因此,作为一个风格问题,如果一个函数需要一个数组,它应该接受数组(
int[]
)和长度。如果它需要一个单一的对象,它应该接受一个指针(int*
)。