【发布时间】:2021-05-26 14:21:27
【问题描述】:
所以这是我第一次在 C 中使用多维数组。我有一个 3D 整数数组正在填充,我想检查以确保值正常,但是数组填充后我遇到了一些问题。 一些类似的代码来解释这种情况:
int a = 10;
int b = 20;
int c = 30;
int* valuesPtr;
valuesPtr = (int*) malloc(a * b * c * sizeof(int));
functionThatFillsValues(valuesPtr); // this function expects a *int, and works.
这里一切正常。然后,我打印出这样的值:
printf("0,0,0: %d\n", *valuesPtr);
这会成功打印 [0][0][0] 处的值。做以下工作:
printf("0,0,1?: %d\n", *(valuesPtr+1));
现在,我从https://www.geeksforgeeks.org/pointer-array-array-pointer/ 了解到,有几种方法可以从该指针指向的位置获取值。
以下工作:printf("0,0,0: %d\n", valuesPtr[0]); 但只要我尝试更进一步,它就会中断。以下都不起作用:
printf("0,0,0: %d\n", valuesPtr[0][0];
printf("0,0,0: %d\n", valuesPtr[0][0][0];
printf("0,1,0: %d\n", valuesPtr[0][1];
printf("0,0,1: %d\n", valuesPtr[0][0][1];
printf("%d\n", *(*(valuesPtr+1)+1));
printf("%d\n", *(*(*(valuesPtr+1)+1)+1));
[] 得到错误“下标值既不是数组也不是指针”,而 *() 尝试得到错误“'unary *' (have 'int') 的类型参数无效”我猜因为在这两种情况下,它都将 valuesPtr[0] 和 *(valuesPtr) 解析为 int,然后不再继续。我猜问题是 valuesPtr 被声明为 *int,所以它认为它只是一个指向 int 的指针。我怎样才能理解它是一个指向 3D 数组的指针,或者通过获取指向内部 2D 或 1D 数组的指针,或者只是让它理解我可以使用 [][][] 表示法?
这样的东西会在正确的位置上寻找吗?
printf("i,j,k: %d", *(valuesPtr+(i*(c*b))+(j*(c))+k)
【问题讨论】:
-
您正在分配一个平面数组,您只能使用
[]或*语法取消引用一次。 Correctly allocating multi-dimensional arrays 的答案可能有你想要的。 -
@m-oehm 不幸的是,该函数不能接受除 *int 之外的任何内容 - 这不是我有权更改的内容。所以它必须是一个平面阵列。但是知道它是一个平面数组,我在问题末尾的想法应该是寻找正确的位置,是吗?
-
@SpaceMouse - 这个想法是正确的,但数学是错误的。由于您实际上使用的是平面数组,因此您必须根据原始分配计算其他维度。像这样: printf("%d ", *(valuesPtr + (i*20*30)+(j*30)+(k)));
-
如果您将平面数组别名为连续的多维数组,您仍然可以使用该答案中使用的技术:
int (*m)[20][10] = (int (*)[20][10]) valuesPtr;现在您可以使用m[k][j][i]语法对数组元素进行索引。 See an example here.