C++;返回数组语法 我在C++中有一个关于返回数组的语法问题。当我们传入一个数组时,什么时候可以这样做: void merge_sort(int input_array[], int size);//notice the first parameter

C++;返回数组语法 我在C++中有一个关于返回数组的语法问题。当我们传入一个数组时,什么时候可以这样做: void merge_sort(int input_array[], int size);//notice the first parameter,c++,arrays,syntax,C++,Arrays,Syntax,我知道这是可行的: int* merge_sort(int input_array[], int size){ //do something with input_array return new int[2]; //dummy array } 问题: int[] merge_sort(int input_array[], int size){ //Question is on return type, wont compile //do something with

我知道这是可行的:

int* merge_sort(int input_array[], int size){
    //do something with input_array
    return new int[2]; //dummy array
}
问题:

int[] merge_sort(int input_array[], int size){ //Question is on return type, wont compile
     //do something with input_array
    return new int[2]; //dummy array
}

返回int*success。为什么返回int[]失败

你为什么一开始就想退货

数组并没有真正“传递”给函数(没有创建元素的副本),只有指向它开头的指针是空的。当函数重新排列数组元素时,它将在原始数组中执行此操作。函数退出后,调用代码可以继续使用旧的(现在已排序)数组

换句话说,该函数会产生副作用

我知道这是可行的:

int* merge_sort(int input_array[], int size){
    //do something with input_array
    return new int[2]; //dummy array
}
(假设您确实需要返回…)

嗯,它“有效”,但非常危险。调用者需要意识到它需要释放返回的数组(否则会发生内存泄漏),并且需要意识到它必须使用
delete[]
,而不仅仅是
delete
(否则会发生未定义的行为),这仅基于返回类型(只是一个指针),显然是不明显的。调用方可能还怀疑
输入数组是否在函数内部释放


即使你记录了所有这些,打电话的人也很容易出错。最好使用现代C++提供的工具:例如,你可以返回一个<代码>:ST::向量< /代码>。

为什么你想一开始就返回任何东西? 数组并没有真正“传递”给函数(没有创建元素的副本),只有指向它开头的指针是空的。当函数重新排列数组元素时,它将在原始数组中执行此操作。函数退出后,调用代码可以继续使用旧的(现在已排序)数组

换句话说,该函数会产生副作用

我知道这是可行的:

int* merge_sort(int input_array[], int size){
    //do something with input_array
    return new int[2]; //dummy array
}
(假设您确实需要返回…)

嗯,它“有效”,但非常危险。调用者需要意识到它需要释放返回的数组(否则会发生内存泄漏),并且需要意识到它必须使用
delete[]
,而不仅仅是
delete
(否则会发生未定义的行为),这仅基于返回类型(只是一个指针),显然是不明显的。调用方可能还怀疑
输入数组是否在函数内部释放


即使你记录了所有这些,打电话的人也很容易出错。使用现代C++提供的设备要好得多:例如,你可以返回一个<代码>:ST::vector < /COD> .< /P>

C和C++,你不能把数组作为参数传递给函数,也不能把数组作为函数结果返回。 是的,语法可以使它看起来像是在传递数组参数:

void func(int param[]) {
    // ...
}

...

int arr[10];
func(arr);
但实际上,这只是传递一个指向数组第一个元素的指针。调整参数定义
int param[]
;它完全等同于
int*param
。在大多数上下文中,数组类型的表达式隐式转换为指针作为第一个元素

这就是为什么需要将大小作为单独的参数传递

仅使用C功能,有几种方法可以执行返回数组之类的操作:

  • 函数可以返回指向
    静态
    数组的第一个元素的指针。这有一些缺点:大小必须固定,并且多个调用者获得指向同一对象的指针
  • 函数可以接收调用者传入的指向数组第一个元素的指针。这将分配和取消分配数组的负担放在调用方身上
  • 函数可以返回指向动态分配的(
    malloc()
    在C++中,
    new
    在C++中)数组的第一个元素的指针。这需要调用方取消分配数组
C++提供了一组丰富的库类,可以为您解决所有这些问题

推荐阅读:本手册第6节


可以将结构作为参数传递,并将其作为函数结果返回,并且结构可以包含数组作为成员。但这并不像你想象的那么有用。作为结构成员的数组必须具有固定大小;在数组上操作的最有用的代码可以处理动态大小。

< P>在C和C++中,不能将数组作为参数传递给函数,也不能将数组作为函数结果返回。 是的,语法可以使它看起来像是在传递数组参数:

void func(int param[]) {
    // ...
}

...

int arr[10];
func(arr);
但实际上,这只是传递一个指向数组第一个元素的指针。调整参数定义
int param[]
;它完全等同于
int*param
。在大多数上下文中,数组类型的表达式隐式转换为指针作为第一个元素

这就是为什么需要将大小作为单独的参数传递

仅使用C功能,有几种方法可以执行返回数组之类的操作:

  • 函数可以返回指向
    静态
    数组的第一个元素的指针。这有一些缺点:大小必须固定,并且多个调用者获得指向同一对象的指针
  • 函数可以接收调用者传入的指向数组第一个元素的指针。这将分配和取消分配数组的负担放在调用方身上
  • 函数可以返回指向动态分配的(
    malloc()
    在C++中,
    new
    在C++中)数组的第一个元素的指针。这需要调用方取消分配数组
C++提供了一组丰富的库类,可以为您解决所有这些问题

推荐阅读:本手册第6节

可以将结构作为参数传递,并将其作为函数结果返回,并且结构可以包含数组作为成员。但这并不是一个有用的方法