首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C11 VLA矩阵存取

C11 VLA矩阵存取
EN

Stack Overflow用户
提问于 2015-04-16 13:50:24
回答 2查看 239关注 0票数 1

C11允许使用VLA数组(和矩阵),例如

代码语言:javascript
复制
int row = 10;
int col = 10;
double matrix[row][col];

但是,如果我想传递给一个函数,我可以使用矩阵中的一行

代码语言:javascript
复制
matrix[row_selected]

就好像我把矩阵定义为

代码语言:javascript
复制
double **matrix_old_style = (double **)malloc(sizeof(double *) * row);
for(i=0;i<row;i++)
matrix_old_style[i] = (double *)malloc(siezeof(double) * col);

或者matrixrow_selected不是指向正确位置的指针(比如matrix_old_stylerow_selected)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 15:54:08

不,通过指针指向指针的2D数组和伪数组是完全不同的。

要将VLA作为函数参数传递,只需执行以下操作

代码语言:javascript
复制
void foo(size_t n, size_t m, double A[n][m]);

或者类似的。注意数组之前的大小,因此nm在这一点上是已知的。如果您始终如一地使用这个概念,编译器将负责索引计算等等。

但是请注意,通常您不希望分配诸如auto变量这样的野兽,因为它们可能会炸掉您的堆栈。更好利用

代码语言:javascript
复制
double (*matrix)[col] = malloc(sizeof(double[row][col]));

当您将它传递给一个函数时,这种类型是编译器重写它时作为函数参数时重写的类型。

票数 2
EN

Stack Overflow用户

发布于 2015-04-16 14:24:25

当然可以,看看下面的代码:

代码语言:javascript
复制
#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;
}

这三个输出是相同的!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29676795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档