如何在c++中通过引用传递堆栈矩阵
How to pass a stack matrix by reference in C++
我的问题很简单,如果我有一个在堆栈上而不是在堆上创建的矩阵,例如int matrix[10][10]
,我如何通过引用传递它?或者,传递它的方式不是传递整个矩阵作为参数,而是传递它的指针或者引用,或者别的什么。我使用c++ 11.
void proc(/*WHAT GOES HERE?*/ matrix, int n){
matrix[n-1][n-1] = 7;
}
int main(){
int matrix[10][10];
proc(matrix, 10);
return 0;
}
您只需要:
// By reference:
void proc_ref(int (&matrix)[10][10]); // first dimension must have a size of 10
// By pointer:
void proc_ptr(int (*matrix)[10], int n); // n is the size of the first dimension
在第一种情况下,matrix
将是一个指向10个int型数组的引用("指向int[10][10]
"),在第二种情况下,matrix
将是一个指向10个int型数组的指针int
("指向int[10]
")。
在这两种情况下,你都可以像在proc
:
matrix[i][j] = 42;
第二个版本允许传递各种大小的矩阵,如int[14][10]
或int[12][10]
(只要第二维尺寸为10)。它还允许传递动态分配的数组,数组为10 int
:
int (*p)[10] = new int[42][10];
proc_ref (p); // Error
proc_ptr (p, 42); // Ok
int m[24][10];
proc_ref (p); // Error
proc_ptr (p, 24); // Ok
如果只允许使用自动存储时间声明的方阵,请使用参考版本。
注意:您必须在编译时指定矩阵的第二维。如果你想要"通用",你可以使用模板:
template <size_t N>
void proc (int (&matrix)[N][N]);
同样,如果你正在使用c++11,你应该使用std::array
,它更方便,同时仍然做你想做的事情(没有动态分配):
template <typename T, size_t N>
using matrix_t = std::array<std::array<T, N>, N>;
template <typename T, size_t N>
void proc (matrix_t<T, N> &matrix) {
matrix[N - 1][N - 1] = 7;
}
int main () {
matrix_t<int, 10> matrix;
proc(matrix);
}
数组可能衰变成指针。可以将形参类型声明为(指向数组的)指针,如
void proc(int (*matrix)[10], int n){
matrix[n-1][n-1] = 7;
}
注意,当数组衰变为指针时,维度将不保留,这意味着在这种情况下,您可能会将int [11][10]
传递给proc()
。
如果你不希望这样,你可以声明参数类型为引用:
void proc(int (&matrix)[10][10], int n){
matrix[n-1][n-1] = 7;
}
此处只能传递int[10][10]
相关文章:
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 如何返回堆栈 c++ 中顶部对象的引用
- 递归中的 C++ 引用(反转堆栈)
- 具有引用计数的无锁堆栈
- 警告#13212:引用需要堆栈对齐功能的EBX
- 未定义对调用堆栈库的引用出现问题
- 堆栈在函数中弹出仍然显示在主函数中。调用不应该通过引用给定的向量吗
- 返回可能在C++中分配在堆栈上的成员时,最佳指针/引用类型是什么
- C++按引用传递:如何使用调用堆栈
- 通过引用传递大型对象时堆栈溢出
- 尝试实现堆栈时C++未定义的引用
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- 如果使用alloca在内联函数中的堆栈上分配变量,那么在内联函数返回后,其引用是否有效
- Visual Studio 在引用堆栈变量时不使用 EBP
- 引用变量是否占用堆栈中的内存
- 如何在C++11中声明堆栈引用