我在解释一些指针声明时遇到了一些麻烦。希望有人可以帮助我。这是针对c99语法的。 如果我有类似
的东西 typedef struct stuff thing;
struct stuff{
int a;
char *(*b)[][2];
int c;
thing *(*d)[];
}
虽然它可能是多余的,你如何将b和d解释为?另外,char *(* b)[] [2]是否与** b [] [2]相同?为什么或为什么不呢?
由于
答案 0 :(得分:0)
C声明总是从里到外读出。除此之外,您需要知道运算符优先级:数组索引运算符的优先级高于解除引用运算符。这就是为什么d
是一个指针(*d
)指针((*d)[]
)到*(*d)[]
的数组(thing
)的原因(thing *(*d)[];
)而不是指向<{1}}的数组的指针。
如您所见,优先级是thing
和*a[]
不相同的原因:第一个是指针数组,第二个是指向数组的指针。
因此,最重要的链接是维基百科中的operator precedence table。
答案 1 :(得分:0)
char *(*b)[][2];
将b
声明为指向两个char
指针的数组数组的指针。要解释这样的表达,请记住;根据以下表格,将优先级分配给考虑优先级和关联的指针声明:
您可以在here中看到一些示例。
char *(*b)[][2]
与char **b[][2]
相同吗?为什么或者为什么不?
没有。 char **b[][2]
将b
声明为指向char
指针的两个指针数组的数组。有理由,请参阅上表。
答案 2 :(得分:0)
从内到外阅读声明。
说
char *(*b)[][2];
表示:
一个名为b
的变量。
但它是什么?哦,它是*b
的指针。
(*b)[][2]
表示它是指向第一维长度为2的二维数组的指针。
但是阵列的类型是什么? char *
表示。
所以整个声明意味着,b是一个指针,指向第一维长度为2的2D char *
数组。
如果是
char **b[][2];
事情如何发生变化?
b
首先与[][2]
一致,因此b[][2]
表示b
是表示2D数组的变量,第一维长度为2。
然后添加char **
,表示b
是第一维长度为2的2D char **
数组。
明智地使用C语言中的打字系统,你可以获得很多惊人的结果。试着了解更多关于树型的信息。
通过明确表达,我认为对第二个的解释要简单得多。
答案 3 :(得分:0)
互动网站C gibberish ↔ English非常实用。
char *(*b)[][2]; // declare b as pointer to array of array 2 of pointer to char
(*b)
是指向TBD的指针
(*b)[][2]
是指向TBD数组2的数组的指针
char *(*b)[][2]
是指向char
char **b[][2]; // declare b as array of array 2 of pointer to pointer to char
b
是TBD
b[][2]
是TBD数组2的数组
char **b[][2]
是一个指向char
不一样。注意()
如何影响解释顺序。
对于字段d
:
thing *(*d)[]; // declare d as pointer to array of pointer to thing
// or declare d as pointer to array of pointer to struct stuff