如何在C++中通过引用传递堆栈矩阵

Fel*_*hes 4 c++ arrays reference matrix c++11

我的问题很简单,如果我在堆栈上而不是在堆上创建矩阵,例如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;

}
Run Code Online (Sandbox Code Playgroud)

Hol*_*olt 10

你只需要:

// 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
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,matrix将引用10个10个数组的数组("引用int[10][10]"),在第二种情况下matrix将是指向数组10的int指针("指向int[10]").

在这两种情况下,您都可以按照自己的意愿使用它proc:

matrix[i][j] = 42;
Run Code Online (Sandbox Code Playgroud)

第二个版本允许传递各种大小的矩阵,例如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
Run Code Online (Sandbox Code Playgroud)

如果您只想允许使用自动存储持续时间声明的方阵,请使用参考版本.

注意:您必须在编译时指定矩阵的第二个维度.如果你想成为"通用",你可以使用一个模板:

template <size_t N>
void proc (int (&matrix)[N][N]);
Run Code Online (Sandbox Code Playgroud)

此外,如果您使用的是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);
}
Run Code Online (Sandbox Code Playgroud)


son*_*yao 5

数组可能会衰减为指针.您可以将参数类型声明为指针(到数组),如:

void proc(int (*matrix)[10], int n){    
    matrix[n-1][n-1] = 7;     
}
Run Code Online (Sandbox Code Playgroud)

请注意,当数组衰减到指针时,不会保留该维度,这意味着在这种情况下您可能会传递int [11][10]proc()它.

如果您不想这样,可以将参数类型声明为引用,如:

void proc(int (&matrix)[10][10], int n){    
    matrix[n-1][n-1] = 7;     
}
Run Code Online (Sandbox Code Playgroud)

只能int[10][10]在这里通过.