加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:39:55 所属栏目:百科 来源:网络整理
导读:我有一个使用指针管理的3D数组的巨大代码.就像是: int *** tab;tab = malloc(m*sizeof(int**));for(i= 1..n) tab[i] = malloc(n*sizeof(int*)); ... etc... 后来元素被访问: tab[i][j][k] = ... 但是由于这个结构的特定问题,我想声明tab作为连续的数组,但
我有一个使用指针管理的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 = %dn",sum3d(dim_n,dim_l,tab));
    return 0;
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读