我理解当数组是&的唯一操作数时的基本思想。或sizeof()运算符,它衰减到指向数组中第一个元素的指针。我不确定这些符号是如何工作的。在我们的文本中,存在1-D情况,而不是数组的3-D情况。第一个示例是名为average的函数的函数声明。一维案例是
double average(double set[]) or
double average(double *set)
那些对我有意义。等效的多D案例没有。他们的宣言是
double average (double set[][DIM1][DIM2]) or
double average (double (*set)[DIM1][DIM2])
类似地,用于打印1-D值的函数声明是:
double *printvalue(double value)
多D案例是:
double(* printvalue(double value))[DIM1] [DIM2]
任何人都可以对此有所了解吗?感谢。
答案 0 :(得分:0)
参数仍然衰减为指针。重要的是DIM1和DIM2指定除一个维度以外的所有维度的大小。所以,如果我们有:
double average (double set[][DIM1][DIM2] myset)
myset [0] [0]是myset [0] [1]之前的DIM2 * sizeof(double)。这两个维度一起表示myset [0]在myset [1]之前是DIM1 * DIM2 * sizeof(double)。您不需要左侧的DIM0,因为行数不会影响指针算术。出于这个原因,你总是可以省略最左边的维度。
答案 1 :(得分:0)
您仍然可以获取指向数组所选节点的指针值。区别在于您是单独获取地址(值,取自编译器)还是实际指针(驻留在内存中某处的变量)的值。这也意味着内存布局。
如果数组中带有空[]
个大括号和初始化器,则指针本身将不存在,只有它的值:对于char a[] = {1,2};
,a
的值将是内存位置a[0]
,相当于&a[0]
。但是,您无法获得char** b = &a
指针的位置,就像使用char* a = {1,2}
一样。
此外,纯数组保证了内存的连续性。你可以调用这样的任何元素:
int values[MAX_Y][MAX_X];
或者像这样:
int values_flat[MAX_Y*MAX_X];
#define values(x,y) = (*( values_flat + MAX_X * (y) + (x) ))
这些在内部是等效的。一个连续的内存块,其结构是编译器的任意选择。
不是这样
int* values[MAX_VAL];
这实际上是指向内存中任意位置的MAX_VAL指针。如果values[0][MAX_VAL]
array[][]
,则values[1][0]
等于{{1}}。在指针数组的情况下,它可以指向分配空间之外的任意内存位置。