C11 VLA 矩阵访问
C11 VLA matrix access
C11 允许像
一样使用 VLA 数组(和矩阵)
int row = 10;
int col = 10;
double matrix[row][col];
但是如果我只想将矩阵的一行传递给函数,我可以使用
matrix[row_selected]
好像我将矩阵定义为
double **matrix_old_style = (double **)malloc(sizeof(double *) * row);
for(i=0;i<row;i++)
matrix_old_style[i] = (double *)malloc(siezeof(double) * col);
或矩阵 [row_selected] 不是指向正确位置的指针(如 matrix_old_style[row_selected])?
当然可以,看这段代码:
#include <iostream>
using namespace std;
void fun(int a[6])
{
cout << a[3] << endl;
}
int main()
{
int a[5][6];
for (int i=0;i<5;i++)
for (int j=0;j<6;j++)
a[i][j]=i+j;
cout << a[2][3] << endl;
cout << *(*(a+2)+3) << endl;
fun(a[2]);
return 0;
}
三个输出是一样的!
不对,二维数组和通过指针指向指针的伪数组根本不是一回事
要将 VLA 作为函数参数传递,只需执行
void foo(size_t n, size_t m, double A[n][m]);
或类似的。请注意大小在数组之前,因此 n
和 m
在该点是已知的。如果您始终使用该概念,编译器将负责索引计算等。
不过请注意,通常您不想分配诸如 auto
变量之类的野兽,因为它们可能会爆炸您的堆栈。更好用
double (*matrix)[col] = malloc(sizeof(double[row][col]));
当你将它传递给一个函数时,这个类型就是编译器重写它的类型,无论如何,当将它用作函数参数时。
C11 允许像
一样使用 VLA 数组(和矩阵)int row = 10;
int col = 10;
double matrix[row][col];
但是如果我只想将矩阵的一行传递给函数,我可以使用
matrix[row_selected]
好像我将矩阵定义为
double **matrix_old_style = (double **)malloc(sizeof(double *) * row);
for(i=0;i<row;i++)
matrix_old_style[i] = (double *)malloc(siezeof(double) * col);
或矩阵 [row_selected] 不是指向正确位置的指针(如 matrix_old_style[row_selected])?
当然可以,看这段代码:
#include <iostream>
using namespace std;
void fun(int a[6])
{
cout << a[3] << endl;
}
int main()
{
int a[5][6];
for (int i=0;i<5;i++)
for (int j=0;j<6;j++)
a[i][j]=i+j;
cout << a[2][3] << endl;
cout << *(*(a+2)+3) << endl;
fun(a[2]);
return 0;
}
三个输出是一样的!
不对,二维数组和通过指针指向指针的伪数组根本不是一回事
要将 VLA 作为函数参数传递,只需执行
void foo(size_t n, size_t m, double A[n][m]);
或类似的。请注意大小在数组之前,因此 n
和 m
在该点是已知的。如果您始终使用该概念,编译器将负责索引计算等。
不过请注意,通常您不想分配诸如 auto
变量之类的野兽,因为它们可能会爆炸您的堆栈。更好用
double (*matrix)[col] = malloc(sizeof(double[row][col]));
当你将它传递给一个函数时,这个类型就是编译器重写它的类型,无论如何,当将它用作函数参数时。