C++ 我可以将指针传递给指针,分配内存,然后再传回吗?

C++ 我可以将指针传递给指针,分配内存,然后再传回吗?,c++,pointers,C++,Pointers,考虑以下代码。这适用于分配单个数组,但如果需要分配二维数组呢?你打算怎么做 #include <iostream> void alloc(int **num) { *num = new int[5]; *num[0] = 5; } int main() { int *num; alloc(&num); std::cout << num[0] << std::endl; delete [] num; }

考虑以下代码。这适用于分配单个数组,但如果需要分配二维数组呢?你打算怎么做

#include <iostream>

void alloc(int **num)
{
    *num = new int[5];
    *num[0] = 5;
}

int main()
{
    int *num;
    alloc(&num);
    std::cout << num[0] << std::endl;
    delete [] num;
}
#包括
无效分配(整数**num)
{
*num=新整数[5];
*num[0]=5;
}
int main()
{
int*num;
alloc(&num);

Std::CUT

你的代码看起来像C。在C++中,我可能会使用自定义类型,不做任何手动动态分配。例如:

typedef std::vector<int> Row;
typedef std::vector<Row> Matrix;

Matrix initMatrix(int nRows,int nCols) {
    return Matrix(nRows,Row(nCols));
}
typedef std::vector行;
向量矩阵;
矩阵初始化矩阵(int nRows,int nCols){
返回矩阵(nRows,行(nCols));
}
在这种情况下,你甚至不需要函数,但是你可以调用构造函数(让
array
为你分配内存)

如果需要分配一个二维数组,该怎么办

我的目标是将**字符传递到函数中并进行分配

因此,您需要的是指向指针数组的指针(每个指针指向一个数组)?这与2D数组不同,尽管为了简单起见,通常将其视为2D数组

就像在分配单个数组时添加了额外的间接层一样,您可以添加间接层来分配指针数组和指向整数数组

因此,您可以编写一个类似于
void alloc(int***num)
的函数

但是使用指针进行间接寻址会使语法更加复杂,并且有用户向函数传递空指针的风险。相反,更好的替代方法是使用引用:
void alloc(int**&num)

因为函数分配了一些东西并“返回一个指针”,所以实际上
return
指针将更有意义:
int**alloc()
。它更漂亮,不是吗?间接性越少越好

最后一个问题是,函数的用户必须知道如何删除分配的内存。它是用
new
还是
new[]
?甚至可能
malloc
?或者函数是否可能返回指向静态对象的指针,该对象不能被删除?函数的调用方无法知道,除非单独记录

另外,如果其中一个分配失败了怎么办?将出现异常,并且早期的分配将泄漏


解决上述2个问题的C++方法是使用RAII容器来管理内存。因为您显然希望有一个数组指向指针,所以在标准库中有一个现成的解决方案:返回<代码> STD::vector < /代码>。如果您需要一个适当的非锯齿二维数组,即矩阵,那么您可能需要WRI。为此,可能使用平面

std::vector
实现自定义rai容器。注意,第三方可能已经实现了此类容器。

看起来不错。我还可以参见
void alloc(int*&num)你想试试。这是一个C问题。在C++中,你只需要使用一个<代码> STD::向量< /代码>,或者一个专用的类型来代表2D数组的任何意思。谢谢你的回应。我知道下面的代码是如何工作的,但是我怎么把它转换成2维?这是我的问题,如果我不够清楚,对不起。唱一个向量是唯一的方法吗?@AxiosAmneisa vector不是唯一的方法,但它是最简单的方法,也是最难出错的方法。与手动内存管理(很容易出错)相比,vector更可取。非常感谢您对解决我问题的多种方法的深入了解。我不知道您能做到什么有向量的向量。我应该能够用您提供的解决我的问题。
std::array
必须在编译时在模板参数中指定大小。
std::vector
是可以在运行时调整大小的:-)