2

我买了一本 Visual c++ 的初学者书,并来到了涉及数组、字符串和指针的章节。我理解这个概念,但是当涉及到多维数组时,我有点迷失了。

数组和指针声明:

double beans[3][4];
double* pbeans;

我理解这部分:

*您可以为指针pbeans声明并赋值,如下:

double* pbeans;
pbeans = &beans[0][0];

但是当作者提出您可以通过键入以下语句来分配第一行/维度的地址时,他失去了我:

pbeans = beans[0];

为什么我们可以在这里跳过“Address-Of”运算符?对我来说,合乎逻辑的事情是:

pbeans = &beans[0];
4

3 回答 3

0

假设你只有一个数组

double legumes[5];

数组衰减为指针,所以你可以做

double* plegumes = legumes;

当您声明一个二维数组时,您所做的是创建一个数组数组。所以表达式beans[0]实际上是指一个数组。所以声明

pbeans = beans[0];

只是将数组分配给指针。

于 2012-12-10T22:58:19.163 回答
0

因为数组衰减为指向第一个元素的指针。如果我们有一个名为 的数组arr,那么对数组不适合的位置的任何使用arr通常都会导致arr被视为指针。这称为衰变。

在这种情况下,beans[0]是一个数组;具体来说,一个double[4]. 但是,由于您不能将数组分配给指针,因此数组会衰减为double*.

您提供的代码double* pbeans = &beans[0];将尝试将指向双精度数组的指针分配给指向双精度的指针;由于类型不匹配,这将不起作用。

此外,除此之外,这听起来不像是一本好书。将数组、字符串和指针一起教授 C 的味道。

于 2012-12-10T22:59:09.317 回答
0

数组类型和指向数组第一个元素的指针之间存在标准转换。作为一个更简单的例子:

int array[5];
int* p = array;

p现在是指向 的第一个元素的指针,因为如果需要,“ array5 int 数组”类型的对象将衰减为“指向”的指针。int

在您的情况下,beans[0]它的类型为“4 double 数组”,并将衰减为指向数组中第一个元素的“指向 double 的指针” beans[0]。相当于做double* p = &beans[0][0]

于 2012-12-10T23:00:56.527 回答