如何计算N维阵列的元素地址

时间:2015-11-05 05:54:25

标签: c arrays pointers multidimensional-array operators

根据我的理解,分配的内存块是连续的,因此数组中的地址是数组数据大小的倍数(某些系统上的int = 4等)

我还看到了数组A和索引i,C中的A[i] == *(A+i)

2D数组就像一个数组数组,所以我想知道如果我疯狂到不使用[]运算符,如何确定N维数组的表达式。

如果数组是用指针创建的,那么是否有必要知道关卡的长度?

2 个答案:

答案 0 :(得分:0)

假设您声明int a[m][n];如果您引用a[i][j],则相当于(a[i])[j],如您所说,它等同于(*(a+i))[j],相当于*((*(a+i))+j) 1}}。就字节而言,整数按指向的对象的大小进行缩放,因此ia[0]*a的大小缩放,这是子的大小-array,sizeof(int) * n。通过*运算符取消引用结果本质上是一个类型转换,将其从指向子数组的指针(类型int (*)[n])转换为指向子数组元素的指针,键入int *。然后,在添加j时,会按sizeof(int)进行缩放。外部解引用通过*运算符实际取消引用指针,可以读取值或修改它,具体取决于上下文。

编辑:这是一个简单的演示程序,您可以尝试。它说明了我的解释:

#include <stdio.h>

int main()
{
    int     a[5][10];

    printf("%d %d %d\n", sizeof(int[5][10]), sizeof(int[10]), sizeof(int));
    printf("%d %d %d\n", sizeof(a), sizeof(a[0]), sizeof(a[0][0]));
    printf("%d %d %d\n", sizeof(a), sizeof(*a), sizeof(**a));

    void   *p1 = a;
    void   *p2 = a + 1;
    void   *p3 = *(a + 1) + 3;

    printf("%d %d\n", (int) (p2 - p1), (int) (p3 - p2));
    printf("%d %d\n", 1 * (sizeof(int) * 10), 3 * sizeof(int));

    return 0;
}

答案 1 :(得分:0)

对于

int array2d[X][Y]; 

这两个表达式是等价的:

array[1][2];
*((int *)array + 1*Y + 2);

有关

int array3d[X][Y][Z]

这两个表达式是等价的:

array[1][2][3];
*((int *)arr + 1*Y*Z + 2*Z + 3);

所以,对于

int arraynd[X][Y][Z]..[N]

这两个表达式是等价的:

arraynd[1][2][3]...[n];
((int *)array + 1*X*Y*Z*...*N + 2*Y*Z*...*N + 3*Z*...*N + ... + n);