指针等同于数组

时间:2013-02-28 01:50:13

标签: c arrays pointers

我知道如果我定义一个类似

的数组
int a [10];

我可以使用指针表示法,使用a+<corresponding_item_in_array>访问它的地址 它的价值在于使用*(a+<corresponding_item_in_array>)

现在我想要改变一些事情,我使用malloc为一个整数指针分配一个内存,并尝试用下标表示法表示指针,但它不起作用

int *output_array;
output_array = (int *) (malloc(2*2*2*sizeof(int))); //i.e, space for 3d array

output_array[0][0][1] = 25;  
// ^ produces error: subscripted value is neither array nor pointer

我可能使用了存储映射的指针表达式,但是不是更简单的方法吗?为什么?

3 个答案:

答案 0 :(得分:3)

int*类型等同于3D数组类型;它相当于一维数组类型:

int *output_array;
output_array = (int *) (malloc(8*sizeof(int))); //i.e, space for array of 8 ints
output_array[5] = 25; // This will work

更高级别数组的问题在于,为了索引到2D,3D等阵列,编译器必须知道除第一个维度之外的每个维度的大小,以便正确地计算索引的偏移量。要处理3D数组,请定义2D元素,如下所示:

typedef int element2d[2][2];

现在你可以这样做:

element2d *output_array;
output_array = (element2d*) (malloc(2*sizeof(element2d))); 
output_array[0][0][1] = 25; // This will work now

Demo on ideone.

答案 1 :(得分:1)

output_array的类型是什么? int *

*(output_array+n)output[n]的类型是什么? int

int是否允许下标?两个下标(例如*(output_array+n)output[n])都是指针操作,int不是指针。这解释了您收到的错误。

你可以像这样声明指向int [x] [y]的指针:int (*array)[x][y];

您可以使用array将符合3D阵列的替代品的存储空间分配到array = malloc(42 * x * y);。这将等同于int array[42][x][y];,除了数组不是可修改的左值,运算符的alignof,sizeof和address-工作方式不同,存储持续时间也不同。

答案 2 :(得分:0)

因为编译器对每个维度的大小一无所知,所以它无法找出output_array[0][0][1]应该在哪里。

你可以试试这个

typedef int (* array3d)[2][2];
array3d output_array;
output_array = (array3d) malloc(2 * 2 * 2 * sizeof(int));
output_array[0][0][1] = 25;
printf("%d\n", output_array[0][0][1]);