具有多维数组表示法的指针算法

时间:2014-12-05 13:38:48

标签: c++ arrays multidimensional-array pointer-arithmetic

这是我的第一个问题:)

double MyArray[][6];
double* Myptr = MyArray[0];

所以我一直想知道为什么,在指针算术中,我可以表示一个指针在这样的单个维度中移动,

*(Myptr + i);

但如果我尝试使用for循环遍历数组的维度,它将不会让我

*(*(Myptr + i) + j); 

然而,它确实让我在数组本身使用这种表示法。

*(*(MyArray + i) + j);

我想知道为什么这是限制?或者我写错了。

4 个答案:

答案 0 :(得分:0)

在这种情况下,MyPtr只是一维的,因为它被分配给MyArray中的特定“数组”。

答案 1 :(得分:0)

Myptr是指向double的指针,因此*(Myptr + i)是双精度型的,虽然您可以添加j,但您无法取消引用结果。

你是否曾这样声明Myptr

double (*Myptr)[6] = MyArray;

然后Myptr将成为指向6 double s数组的指针。因此*(Myptr + i)将是double[6],表达式将起作用。

不幸的是,你可以使用这种语法对数组进行索引,这对于那些第一次看到并且从未被教过指针衰减的人来说是令人惊讶的。关于C和C ++中的数组的一个有趣的事情是它们几乎在所有情况下都会衰减成指针。这意味着几乎总是当你使用一个数组(存在异常)时,数组被隐式转换为指向其第一个元素的指针,其余部分用指针算法完成。

例如,当您编写MyArray[i]时就是这种情况。标准将MyArray[i]定义为*(MyArray + i)(标准使用更多括号,但这是它归结为的),当您理解MyArray衰减到指针时,这是有意义的,{将{1}}添加到此指针,并取消引用生成的指针。它还解释了为什么i同样有效(如果样式不好)。

在多维数组的上下文中,重要的是要理解多维数组只是一个数组数组。在您的情况下,i[MyArray]是一组双打数组。那么,MyArray就是一系列双打。在指针衰减中,MyArray[0]衰减到指向双精度数组的指针,当你取消引用该指针并使用它所指向的数组时,那么那个数组也会衰减到一个指针(到当你使用它时。它一直在衰退。

答案 2 :(得分:0)

MyArray的类型为double[][6],MyPointer的类型为double*

现在数组和指针是不同的,但在这种情况下这并不重要。两个变量的类型都有数组/指针内容,但My Array有两个(统计它们:[][6])而MyPointer只有一个(计数:*)。这就是为什么你可以将解除引用(即*运算符)应用于MyArray两次,并仅应用于MyPointer一次。

现在,如果你想要一个可以像使用MyArray一样使用的指针,这是可能的,但它的类型不会是double**(因为数组和指针不同)。你这样写:

double (*MyPointer2)[6] = MyArray;

这个类型在其类型中有两个数组/指针内容,因此您可以对其应用两次解除引用。

答案 3 :(得分:-1)

因为Myptrdouble*。指向double的指针。它不了解数组维度。