如何解释稍微复杂的指针声明

时间:2014-09-16 20:21:33

标签: c arrays pointers

我在解释一些指针声明时遇到了一些麻烦。希望有人可以帮助我。这是针对c99语法的。 如果我有类似

的东西
    typedef struct stuff thing;
    struct stuff{
        int a;
        char *(*b)[][2];
        int c;
        thing *(*d)[];
    }

虽然它可能是多余的,你如何将b和d解释为?另外,char *(* b)[] [2]是否与** b [] [2]相同?为什么或为什么不呢?

由于

4 个答案:

答案 0 :(得分:0)

C声明总是从里到外读出。除此之外,您需要知道运算符优先级:数组索引运算符的优先级高于解除引用运算符。这就是为什么d是一个指针(*d指针((*d)[]*(*d)[]的数组(thing)的原因(thing *(*d)[];)而不是指向<{1}}的数组的指针

如您所见,优先级是thing*a[]不相同的原因:第一个是指针数组,第二个是指向数组的指针。

因此,最重要的链接是维基百科中的operator precedence table

答案 1 :(得分:0)

char *(*b)[][2];b声明为指向两个char指针的数组数组的指针。要解释这样的表达,请记住;根据以下表格,将优先级分配给考虑优先级和关联的指针声明:

enter image description here

您可以在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

指针的数组2的数组的指针
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

指针的数组2的数组

不一样。注意()如何影响解释顺序。

对于字段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