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