c – 如何访问具有多个括号的1D阵列以便于阅读?

前端之家收集整理的这篇文章主要介绍了c – 如何访问具有多个括号的1D阵列以便于阅读?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用指针管理的3D数组的巨大代码.就像是:
int *** tab;
tab = malloc(m*sizeof(int**));
for(i= 1..n) tab[i] = malloc(n*sizeof(int*));  
... etc...

后来元素被访问:

tab[i][j][k] = ...

但是由于这个结构的特定问题,我想声明tab作为连续的数组,但在代码中仍然使用带有3个方括号的语法.编译器将内部替换它们,如下所示:

tab[i][j][k] = ...  =>  tab[i*m*n+j*m+k] = ...

因此,仅使用一个指针取消引用来访问数组.我不想更改源代码(没有sed).

例如我可以通过在堆栈中声明tab来实现:

int tab[n][m][l];

但是不幸的是,如果m和n是运行时变量,这不起作用.

解决方法

在C(C99或C11)中,具有可变维度的制表符阵列可以作为函数参数传递,只要其尺寸也在前面的参数中传递即可.这是一个示例来显示我的意思:
#include <stdio.h>
#include <stdlib.h>

int sum3d(unsigned int dim_n,unsigned int dim_m,unsigned int dim_l,int tab[dim_n][dim_m][dim_l])
{
    int total = 0;
    int n,m,l;

    for (n = 0; n < dim_n; n++)
    {
        for (m = 0; m < dim_m; m++)
        {
            for (l = 0; l < dim_l; l++)
            {
                total += tab[n][m][l];
            }
        }
    }
    return total;
}

int main(void)
{
    unsigned int dim_n,dim_m,dim_l;
    unsigned int n,l;
    int tot;

    dim_n = 10;
    dim_m = 5;
    dim_l = 4;

    int (*tab)[dim_m][dim_l] = calloc(dim_n,sizeof(*tab));
    if (!tab)
    {
        fprintf(stderr,"Memory allocation failure!\n");
        exit(1);
    }
    for (n = 0; n < dim_n; n++)
    {
        for (m = 0; m < dim_m; m++)
        {
            for (l = 0; l < dim_l; l++)
            {
                tab[n][m][l] = 1;
            }
        }
    }

    printf("total = %d\n",sum3d(dim_n,dim_l,tab));
    return 0;
}

函数sum3d中,tab可以被声明为int tab [] [dim_m] [dim_l],或者作为int(* tab)[dim_m] [dim_l],在这两种情况下都省略了最左边的维.

猜你在找的C&C++相关文章