帮助理解c ++中的多维数组和指针表示法

时间:2010-02-02 03:07:04

标签: c++

我理解当数组是&的唯一操作数时的基本思想。或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]

任何人都可以对此有所了解吗?感谢。

2 个答案:

答案 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}}。在指针数组的情况下,它可以指向分配空间之外的任意内存位置。