函数参数中的C++数组指针[重复]

qgzx9mmu  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(121)

此问题在此处已有答案

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;
    }
}

x4shl7ld

x4shl7ld1#

从https://en.cppreference.com/w/cpp/language/function#Parameter_list下载:
参数列表中每个函数参数的类型根据以下规则确定:
[..]
2)如果类型是“T的数组”或“T的未知边界的数组”,则将其替换为类型“指向T的指针”
[..]
由于这些规则,下面的函数声明声明完全相同的函数:

int f(char[]);
int f(char* s);
int f(char* const);
int f(char* volatile s);

字符串

px9o7tmv

px9o7tmv2#

因为这是C的规则(它继承自C)。
C语言的设计者们认为将数组传递给函数是一个坏主意,他们认为传递一个指向数组第一个元素的指针更好,值得怀疑(在我看来)。
但他们也决定不想在函数参数声明中废除数组语法,所以他们决定,当用作函数参数时,数组形式T param[]只是指针形式T* param的一种不同写法,甚至在为数组指定大小时也是一样的(这被忽略了),T param[10]也是一个指针。更值得怀疑的是(在我看来)。
在C
中,你可以通过使用std::vectorstd::array来避免这一切,但在C中,你就没有那么幸运了。

vfhzx4xs

vfhzx4xs3#

假设我们声明了一个int的数组:

int values[10];

字符串
在堆栈上分配了一个内存块,用于存储10个int,变量values包含该内存块的开始地址,或者换句话说,包含数组的第0个元素的地址,这是同一个东西。
因此

&values[0] == values


永远都是真.
类似地,这两个语句都是针对同一个元素的

cout << values[5];
cout << *(values + 5);


因此,如果我们有一个函数参数(或任何其他变量),它可以声明为int*int[]类型,并且两者都接受values,因为这两种声明都只是声明同一事物(指针)的替代方式。
这可能会造成混淆,因为对foo()的这两个调用都是有效的:

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


因此,作为一个风格问题,如果一个函数需要一个数组,它应该接受数组(int[])和长度。如果它需要一个单一的对象,它应该接受一个指针(int*)。

相关问题