C重塑1d到2d

时间:2014-10-09 09:14:45

标签: c

我想将长度为L的数组重新整形为MxN之一,但是不是通过复制for循环中的元素来创建新内存我想做一些指针转换以允许我使用双下标来访问数组(array [X] [Y])。

我已经搜索了好几年了,找不到任何有用的东西。

真的很感激任何帮助。

编辑:感兴趣的数组在堆上而不是堆栈。

4 个答案:

答案 0 :(得分:4)

指针式转换在这里看起来不是一个好主意。但是如果在运行时之前知道列数,我经常遇到的一个选项是简单地定义一个宏,例如。

#define arrayName(i,j) arrayName[((i)*N) + (j)]

或者

 #define ELEMENT(arrayName, i,j) (arrayName)[((i)*N) + (j)]

如果您希望它更灵活。

答案 1 :(得分:2)

union是你的朋友:

#include <stdio.h>

#define M 5
#define N 4

typedef union {
    int a1[M * N];
    int a2[M][N];
} U;

int main()
{
    U u;
    int i, j;

    for (i = 0; i < M * N; ++i)
    {
        u.a1[i] = i;
    }

    for (i = 0; i < M; ++i)
    {
        for (j = 0; j < N; ++j)
        {
            printf("%8d", u.a2[i][j]);
        }
        printf("\n");
    }

    return 0;
}

答案 2 :(得分:0)

typedef是你的朋友:

#include <stdio.h>
#include <stdlib.h>

#define M 5
#define N 4

typedef int Array1D[M * N];
typedef int Array2D[M][N];

int main()
{
    Array1D *a1 = malloc(sizeof(*a1));
    Array2D *a2 = (Array2D *)a1;
    int i, j;

    for (i = 0; i < M * N; ++i)
    {
        (*a1)[i] = i;
    }

    for (i = 0; i < M; ++i)
    {
        for (j = 0; j < N; ++j)
        {
            printf("%8d", (*a2)[i][j]);
        }
        printf("\n");
    }

    free(a1);

    return 0;
}

注意:上面的代码现已更新为使用堆分配,以免破坏严格的别名规则。

答案 3 :(得分:0)

顺便说一句,如果你想要它超级动态(因为在编译时没有大小),你可以通过不复制所有值但通过为第二维创建索引来实现这一点:

#include <stdio.h>
#include <stdlib.h>

const int FULL = 100;
const int X = 10;
const int Y = 10;

int *dim1;
int **nested;

int main(void) {
    dim1 = malloc(sizeof(int)*FULL);
    nested = malloc(sizeof(int*)*X);
    for(int i=0; i<X;i++)
    {
        nested[i] = &dim1[Y*i];
    }
    dim1[15] = 42;
    printf("nested[1][5]: %d",nested[1][5]);

    free(nested);
    free(dim1);
    return 0;
}