VCa*_*ake 2 c++ pointers multidimensional-array
我有一个4D数组,我想创建一个函数,我可以用来引用4D数组内的2D数组,并通过在函数调用中附加带索引的方括号来读取其数据.
int numbers[2][3][4][4] = {
{
{{1,2,3,4}, {4,3,2,1}, {6,7,8,9}, {9,8,7,6}},
{{0,1,0,1}, {1,0,1,0}, {1,1,0,0}, {0,0,1,1}},
{{5,4,1,8}, {4,2,5,1}, {7,2,5,8}, {4,2,5,1}}
},
{ /* same stuff */ }
};
Run Code Online (Sandbox Code Playgroud)
例如,如果我想访问{4,2,5,1},我可以创建一个函数,返回指向该数组的第一个int的指针(&number [0] [2] [1] [0]),并使用func()[1],func()[2],func()[3]访问元素,嗯......你知道的.
int* func() {
return &numbers[0][2][1][0];
}
// func()[2] => 5
Run Code Online (Sandbox Code Playgroud)
但是我怎么能创建一个函数来返回对数字[0] [2]的引用,所以例如我可以做func()[1][0]
,它会返回5?
看来我应该完成对C/C++指针,引用和数组的理解,但我也会欣赏"std"和C++ 11特定的解决方案(在标准数组上使用一些很酷的std :: class).谢谢 :)
在C++中,最好的方法是返回对2D数组的引用
int (&func())[4][4] {
return numbers[0][2];
}
Run Code Online (Sandbox Code Playgroud)
现在你可以访问它了
func()[i][j]
Run Code Online (Sandbox Code Playgroud)
这完全保留了2D数组类型并保留了自然访问语法.
如果你坚持专门返回指针,那么你可以返回指向该2D数组中第一个1D数组的指针
int (*func())[4] {
return numbers[0][2];
}
Run Code Online (Sandbox Code Playgroud)
这将保留访问语法
func()[i][j]
Run Code Online (Sandbox Code Playgroud)
但是,正如您所看到的,这是2D阵列类型衰减为1D阵列类型的价格.
或者,如已经建议的那样,您可以返回指向2D数组的指针
int (*func())[4][4] {
return &numbers[0][2];
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,您必须记住将2D数组元素作为
(*func())[i][j]
Run Code Online (Sandbox Code Playgroud)
即它保留了2D数组类型,但强制您使用更复杂的访问语法.
出于这个原因,引用似乎是最好的方法(只要你坚持使用原始数组),结合两种基于指针的方法的"最佳"特性.
PS Typedefing 2D数组类型将产生更可读的函数声明.例如,如果你这样做
typedef int Numbers2D[4][4];
Run Code Online (Sandbox Code Playgroud)
然后第一个变种将变成
Numbers2D &func() {
return numbers[0][2];
}
Run Code Online (Sandbox Code Playgroud)