C++ 如何将二维数组转换为指针指针

C++ 如何将二维数组转换为指针指针,c++,C++,假设您有一个二维数组,它已初始化为 int M[5][5] = { {1,3,4,2,5}, {3,5,1,6,2}, {7,5,6,2,0}, {6,2,9,7,6}, {1,0,8,5,2} }; 此M将作为参数传递给函数。但是,该函数只接受int**作为参数,而不接受int[][5] 我的问题是,如何进行这种转换?指向指针的指针数组和二维数组在C中是完全不同的数

假设您有一个二维数组,它已初始化为

int M[5][5] = { {1,3,4,2,5},
                {3,5,1,6,2},
                {7,5,6,2,0},
                {6,2,9,7,6},
                {1,0,8,5,2} };
M
将作为参数传递给函数。但是,该函数只接受
int**
作为参数,而不接受
int[][5]


我的问题是,如何进行这种转换?

指向指针的指针数组和二维数组在C中是完全不同的数据结构:

  • int**
    通常指指针数组,每个指针指向不同的行(分配到别处)
  • int[5][5]
    引擎盖下面是一个普通的线性数组,其中的行一行接一行地存储,编译器会自动对索引执行计算以访问正确的元素
因此,拥有一个
int[5][5]
,您必须自己构建指针数组,它将充当矩阵行的“索引”

int * m2[5];
for(int i=0; i<5; ++i)
    m2[i]=M[i];
f(m2);
int*m2[5];

对于(int i=0;i,指向指针的指针数组和二维数组在C中是完全不同的数据结构:

  • int**
    通常指指针数组,每个指针指向不同的行(分配到别处)
  • int[5][5]
    引擎盖下面是一个普通的线性数组,其中的行一行接一行地存储,编译器会自动对索引执行计算以访问正确的元素
因此,拥有一个
int[5][5]
,您必须自己构建指针数组,它将充当矩阵行的“索引”

int * m2[5];
for(int i=0; i<5; ++i)
    m2[i]=M[i];
f(m2);
int*m2[5];

对于(int i=0;i,指向指针的指针数组和二维数组在C中是完全不同的数据结构:

  • int**
    通常指指针数组,每个指针指向不同的行(分配到别处)
  • int[5][5]
    引擎盖下面是一个普通的线性数组,其中的行一行接一行地存储,编译器会自动对索引执行计算以访问正确的元素
因此,拥有一个
int[5][5]
,您必须自己构建指针数组,它将充当矩阵行的“索引”

int * m2[5];
for(int i=0; i<5; ++i)
    m2[i]=M[i];
f(m2);
int*m2[5];

对于(int i=0;i,指向指针的指针数组和二维数组在C中是完全不同的数据结构:

  • int**
    通常指指针数组,每个指针指向不同的行(分配到别处)
  • int[5][5]
    引擎盖下面是一个普通的线性数组,其中的行一行接一行地存储,编译器会自动对索引执行计算以访问正确的元素
因此,拥有一个
int[5][5]
,您必须自己构建指针数组,它将充当矩阵行的“索引”

int * m2[5];
for(int i=0; i<5; ++i)
    m2[i]=M[i];
f(m2);
int*m2[5];
对于(inti=0;i
templatestruct索引{};
templatestruct生成索引:生成索引{};
templatestruct生成索引:索引{};
模板
std::数组作为锯齿状的辅助对象(T(&arr)[X][Y],索引){
返回{arr[Is]…};
}
模板
std::数组为锯齿状(T(&arr)[X][Y]){
返回为_jagged_helper(arr,make_index());
}
然后只需调用
f(&(作为锯齿(M)[0]);

templatestruct index{};
templatestruct生成索引:生成索引{};
templatestruct生成索引:索引{};
模板
std::数组作为锯齿状的辅助对象(T(&arr)[X][Y],索引){
返回{arr[Is]…};
}
模板
std::数组为锯齿状(T(&arr)[X][Y]){
返回为_jagged_helper(arr,make_index());
}
然后只需调用
f(&(作为锯齿(M)[0]);

templatestruct index{};
templatestruct生成索引:生成索引{};
templatestruct生成索引:索引{};
模板
std::数组作为锯齿状的辅助对象(T(&arr)[X][Y],索引){
返回{arr[Is]…};
}
模板
std::数组为锯齿状(T(&arr)[X][Y]){
返回为_jagged_helper(arr,make_index());
}
然后只需调用
f(&(作为锯齿(M)[0]);

templatestruct index{};
templatestruct生成索引:生成索引{};
templatestruct生成索引:索引{};
模板
std::数组作为锯齿状的辅助对象(T(&arr)[X][Y],索引){
返回{arr[Is]…};
}
模板
std::数组为锯齿状(T(&arr)[X][Y]){
返回为_jagged_helper(arr,make_index());
}

然后简单地调用
f(&(as_jagged(M)[0]))

@GrijeshChauhan请再读一遍这个问题。你的评论与之无关。@GrijeshChauhan这行不通;
p
不能作为
int**
传递,它将是一个
int***
@mbrach:它为什么要接受它?二维矩阵不是指针数组,也不是直接可转换的o it.it可能重复的
int**
int[][]
是非常不同的事情。请参见声明的my.M,这是一个数组,而不是指针。如果M是用mallocs分配的,那么它就可以工作。对于gcc:error:无法将参数“1”的“int()[5]”转换为“int*”,以“void f(int**)“@GrijeshChauhan请再看一遍这个问题。你的评论与之无关。@GrijeshChauhan这行不通;
p
不能作为
int**
传递,它将是
int***
@mbrach:为什么它应该接受它?二维矩阵不是指针数组,也不是可以直接转换成它的。possib复制
int**
int[][]