我从一本书中读到:for double beans[3][4]
如果我们想要一个名为pbeans
的指针指向它,我们需要将其声明为
double (*pbeans) [4] =beans;
我的问题是:
为什么会这样:
double (*pbeans) [4] =beans
;
但不是:
double[4] *pbeans =beans
;
我该如何阅读double (*pbeans) [4]
?
(比方说,const int * const pi
我们可以从右到左读取const指针到整数常量)。
答案 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