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

5

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

}

@Felo Vilches 在参数前使用 **&**,例如 **int & matrix[10][10]**。 - userfi
3
那将是一个二维引用数组。正确的语法是 int (&matrix)[10][10] - Angew is no longer proud of SO
2个回答

12
您只需要:
// 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 个数组的数组的引用,每个数组都包含 10 个整数(“指向 int[10][10] 的引用”);在第二种情况下,matrix 将是指向包含 10 个 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);
}

5

数组可能会衰变为指针。您可以将参数类型声明为指针(指向数组),例如:

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] 可以在这里传递。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接