【问题标题】:how char * (*arr)[2 ] and char **array[2] are different from each other?char * (*arr)[2] 和 char **array[2] 有何不同?
【发布时间】:2013-09-02 14:33:25
【问题描述】:

char * (*arr)[2] 和 char **array[2] 有何不同?如果我使用函数传递char* strings[2],那么如何从问题第一部分中提到的两种方式访问​​元素? 还请告诉其他访问指针数组元素的方法。 谢谢。

【问题讨论】:

  • 在 C 中?还是在 C++ 中?
  • 一个是数组,另一个是指向数组的指针。
  • 您的标题和您的问题不匹配。请更正一个。
  • @chrylis:他只是忘记(或不知道)将他的代码包含在反引号中。是一样的。
  • @DmitriZaitsev:这就是标签的用途。

标签: c++ c arrays string pointers


【解决方案1】:

CDecl 报告:

char *(*arr)[2]

declare arr as pointer to array 2 of pointer to char

和

char **arr[2]

declare arr as array 2 of pointer to pointer to char

只是[]数组声明符的优先级高于*指针限定符,所以括号改变了含义。

【讨论】:

  • 当,一个网站做到了。知道评估规则的顺序我觉得很傻。
  • @Hogan 我在这里看不到评估顺序问题。这是一个优先级的问题。没有任何评价。声明是语句,而不是表达式。
  • ???? @H2CO2——我不是说有问题。我想从技术上讲,我使用了“评估顺序”这个词,而不是 predence - 但你为什么要狙击我开玩笑说的愚蠢评论?
  • @Hogan 抱歉,我没有意识到这很有趣。此外,一些人认为优先级 == 评估顺序是一个常见的混淆来源。但它不是——想想&& 和|| 运算符(关于这个问题有很多关于SO 的问题,如果你有兴趣,请阅读其中一个。)
【解决方案2】:

关注spiral rule:-

a] char *(*arr)[2]

        +------+
        | +--+ |
        | |  | |
        | ^  | |
char * (*arr ) [2] 
     |  |    | |
     |  |    | |
     |  +----+ |
     +---------+

identifier arr is pointer 
            to array of 2
            pointer to char

b] char **arr[2]

      +----------+
      | +----+   |
      | ^    |   |
char* *arr   [2] |
    | |      |   |
    | +------+   |
    +------------+


identifier arr is an array 2
            of pointers
            to pointer
            to char

同样,

c] char* 字符串[2]

                    +-----+
                    |     |
                    ^     |
            char *strings [2]
                 |        |
                 +--------+

 identifier string is an array of 2
            pointers 
            to char

所以,知道找出差异

【讨论】:

  • 这太棒了!!请修复第一个错误的图表——首先指向指针然后指向数组(在() 内)像这样:gist.github.com/hoganlong/6413843
  • @Hogan 抱歉,请您修复一下,我没明白您的意思
  • @Hogan 啊哈,我想现在我用开始标记^
  • @POW - 我明白你的意思了。我做了一个小改动,所以它首先出现的是* - 你觉得呢?
  • @POW - 好的,我改回来了,我明白你的意思,而不是我的想法。
【解决方案3】:

char * (*arr)[2] 是指向指针数组的指针。

char **array[2] 是一个指向指针的数组。

如果我使用函数传递char* strings[2],那么如何从问题第一部分中提到的两种方式访问​​元素?

strings 是一个指针数组,所以&strings 给出了第一种类型。你不能从中得到第二种类型。

在 C++ 中,我建议您停止使用奇怪的复合类型,而改用更高级别的类似数组的类,例如 std::vector 和 std::string。

【讨论】:

    【解决方案4】:

    char **array[2] 是一个指向字符指针的 2 元素数组。

    char *(*arr)[2] 是一个指向字符指针的二元素数组的指针。

    注意。当 null 终止时,指向字符的指针可以用作 C 中的字符串。

    【讨论】:

      【解决方案5】:

      我一直觉得有用的规则是“由内而外,从右到左”:

      char *(*arr)[2];
      

      所以里面首先,paren组有'*arr',从右到左是“arr是一个指针”

      括号中没有任何内容,因此“arr 是指向其余部分的指针”,从右到左:由两个指向 char 的指针组成的数组。

      我一直觉得有用的一条类似的简短规则是说“C 数组的值是指向其第一个元素的指针”——这也突出了名称用于其值和其他用途之间的区别属性:f(arr) 和arr+1 都使用arr 的值,并且每个值中的值都是指向其第一个元素的指针(其数组和边界被剥离),但例如sizeof arr 不计算,因此给出了数组大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-28
        • 2012-05-08
        • 2013-12-19
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 2014-02-25
        • 1970-01-01
        相关资源
        最近更新 更多