根据我的理解,分配的内存块是连续的,因此数组中的地址是数组数据大小的倍数(某些系统上的int = 4等)
我还看到了数组A和索引i,C中的A[i] == *(A+i)
。
2D数组就像一个数组数组,所以我想知道如果我疯狂到不使用[]
运算符,如何确定N维数组的表达式。
如果数组是用指针创建的,那么是否有必要知道关卡的长度?
答案 0 :(得分:0)
假设您声明int a[m][n];
如果您引用a[i][j]
,则相当于(a[i])[j]
,如您所说,它等同于(*(a+i))[j]
,相当于*((*(a+i))+j)
1}}。就字节而言,整数按指向的对象的大小进行缩放,因此i
按a[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);