关于指向多维数组的指针

时间:2014-03-27 14:17:43

标签: c pointers

我从一本书中读到:for double beans[3][4]

如果我们想要一个名为pbeans的指针指向它,我们需要将其声明为

double (*pbeans) [4] =beans;

我的问题是:

  1. 为什么会这样:

    double (*pbeans) [4] =beans;

    但不是:

    double[4] *pbeans =beans;

  2. 我该如何阅读double (*pbeans) [4]? (比方说,const int * const pi我们可以从右到左读取const指针到整数常量)。

3 个答案:

答案 0 :(得分:1)

C声明语法基于表达式的类型,而不是对象。这也被称为“宣言模仿使用”。

您有一个指向名为double的{​​{1}}的4元素数组的指针。要从指向数组访问元素,必须首先使用一元pbeans运算符取消引用pbeans,然后将下标应用于该解除引用的结果:

*

括号是必要的,因为下标运算符double x = (*pbeans)[i]; 的优先级高于一元[]运算符;如果你写了*,它将被解析为*pbeans[i],它会尝试取消引用*(pbeans[i])的结果,这不是我们想要的。

表达式的类型 pbeans[i](*pbeans)[i],因此double的声明是

pbeans

decalration读作

double (*pbeans)[4];

答案 1 :(得分:0)

  

为什么它是double (*pbeans) [4] =beans;而不是double[4] *pbeans =beans;

这是因为你需要指向数组beans的第一个元素的指针,它的第一个元素是一个包含4个元素的一维数组。
为什么不double[4] *pbeans =beans;

因为这不是有效的C语法。

  

我该如何阅读double (*pbeans) [4]? (比如,const int * const pi我们可以从右到左读取const指针到整数常量)。

您可以将其视为* pbeans是指向4 doubles数组的指针。您可以使用spiral rule来解析此类声明。

答案 2 :(得分:0)

1)C语言是使用

声明数组的格式
datatype name[][];

格式。这里

double (*pbeans) [4] =beans;

表示pbeans是一个包含4个项目的数组,其中每个项目的类型为double *,即指向double的指针。

2)你读了

const int * const pi

从右到左为pi is a constant pointer to a integer constant