char * (*arr)[2] 和 char **array[2] 有什么区别?

4
如何区分 char * (*arr)[2]char **array[2]?假设我正在使用函数传递char* strings[2],则如何从问题第一部分提到的两种方式中访问元素?还请告诉其他访问指针数组元素的方法。谢谢。

6
用 C 还是用 C++? - David Schwartz
2
一个是数组,另一个是指向数组的指针。 - Kerrek SB
你的标题和问题不匹配,请纠正其中一个。 - chrylis -cautiouslyoptimistic-
@chrylis:他只是忘记(或不知道)在反引号中括起来他的代码。这是一样的。 - Benjamin Lindley
1
@DmitriZaitsev:这就是标签的用途。 - Mike Seymour
显示剩余3条评论
5个回答

12

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
@Hogan 我在这里看不到任何求值顺序的问题。这是一个优先级问题。没有任何计算。声明是语句,而不是表达式。 - user529758
@H2CO2 -- 我并没有说有问题。我想从技术上讲,我使用了“评估顺序”这个术语,而不是优先级 - 但你为什么要攻击我开玩笑说的愚蠢评论呢? - Hogan
@Hogan 抱歉,我没有意识到这很有趣。此外,一些人认为优先级等于评估顺序,这是一个常见的混淆来源。然而,实际上并不是这样的——想想 &&|| 运算符(在 SO 上有很多关于这个问题的问题,如果你感兴趣可以阅读其中之一)。 - user529758

7

Follow the 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

Similarly,

c] char* strings[2]

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

 identifier string is an array of 2
            pointers 
            to char

所以,现在了解区别。

太好了!请修复第一个图表,它是错误的--先指向指针,然后再指向数组(在()内)。像这样:https://gist.github.com/hoganlong/6413843 - Hogan
@Hogan,抱歉,您能修复一下吗?我不明白您的意思。 - P0W
@Hogan 哦,我想是一样的。现在我使用了起始标记^ - P0W
@POW - 我知道你的意思...我做了一个小改变,让它首先命中 * -- 你觉得怎样? - Hogan
1
@POW - 好的,我改回来了,我明白你的意思了,不是我之前想的那样。 - Hogan

5

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

char **array[2] 是指针到指针的数组。

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

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

在 C++ 中,我建议您停止使用奇怪的复合类型,而是使用类似于 std::vectorstd::string 的高级数组类。


2

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

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

注意:在C语言中,指向字符的指针可以作为字符串使用,需要以null结尾。


1
我一直觉得有用的规则是“从里到外,从右到左”:
char *(*arr)[2];

所以在括号内部,' *arr '表示" arr 是一个指针",从右往左看。

括号内没有剩余内容,因此"arr是一个指针"适用于剩下的部分,从右往左看:一个包含两个指向字符的指针的数组。

我一直觉得有一个类似的简短规则非常有用,即“C数组的值是其第一个元素的指针”--这也突显了使用名称的值和其他属性之间的区别:f(arr)arr + 1 都使用 arr 的值,在每种情况下,它的值都是指向其第一个元素的指针(带有其数组特性和范围),但例如 sizeof arr 不会被评估,因此会给出数组大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接