C++ C++;函数参数中的数组指针
有人能给我解释一下这些功能是如何/为什么相同的吗C++ C++;函数参数中的数组指针,c++,arrays,pointers,C++,Arrays,Pointers,有人能给我解释一下这些功能是如何/为什么相同的吗 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)
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;
}
}
#包括
使用std::cout;
使用std::endl;
void doubleArray(int*值,int长度);
int main(){
整数长度=10;
int值[长度];
for(int i=0;i
参数列表中每个功能参数的类型根据以下规则确定:
[……]
2) 如果类型为“T的数组”或“T的未知边界数组”,则替换为类型“指向T的指针”
[……]
由于这些规则,以下函数声明声明了完全相同的函数:
int f(char[]);
int f(char* s);
int f(char* const);
int f(char* volatile s);
为什么它们是一样的?因为这是C++的规则(它继承了C)。< /P>
C语言的设计者认为将数组传递给函数是一个坏主意。他们认为最好是将指针传递给数组的第一个元素。这在我看来是有问题的
但是他们也决定不想废除函数参数声明中的数组语法。因此他们决定,当用作函数参数时,数组形式t param[]
只是编写指针形式t*param
的一种不同方式。如果为数组指定一个大小,它甚至是相同的(被忽略),T参数[10]
也是一个指针。在我看来,更值得怀疑的是
在C++中,你可以通过使用<代码> STD::vector < /COD>或<代码> STD::数组来避免所有这些。在C中,你不太幸运。 < P>假设我们声明了一个数组< <代码> int >代码>:
int values[10];
堆栈上分配了一个10整数的内存块,变量values
包含该内存块开头的地址,或者换句话说,数组第0个元素的地址,这是相同的
因此
这永远是真的
类似地,这两个语句处理相同的元素
cout << values[5];
cout << *(values + 5);
因此,作为一个样式的问题,如果函数期望数组,则应该使用数组(<代码> int []/COD>)和长度。如果它期望一个对象,则它应该使用一个指针(<代码> int */COD> >)。 C数组在使用函数元素时,它会退化为指向第一个元素的指针。不要使用C数组。C++有.<代码> int值[长度]。;
是可变长度数组(因为length
不是constepr
)C++编译器不支持它。许多编译器不会编译它。你应该设置<代码> COSTEXPRINT=10;读数组和指针之间的关系是不相关的:因为你的数组在编译时有未知的长度,你应该使用<代码> STD::vector < /Cord>。s是int[]类型的变量。此处的值为:void doubleArray(int values[],int length)是的。这就是问题所在。我解释了为什么它们是一样的。仍然是错误的:变量values
不包含地址。这就像说一个double
类型的变量包含一个整数。values
确实包含一个地址。否则int x=*values;
怎么可能有效?您只能反求引用指针,指针包含地址。
cout << values[5];
cout << *(values + 5);
void foo (int[] vals);
int values[10];
foo (values); // Passing an array
int x = 0;
int* px = &x:
foo (px); // Passing a single object by address