4

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

4

5 回答 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

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

于 2013-09-02T14:40:13.627 回答
7

遵循螺旋规则:-

a] 字符 *(*arr)[2]

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

identifier arr is pointer 
            to array of 2
            pointer to char

b] 字符 **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

所以,知道找出差异

于 2013-09-02T14:57:57.040 回答
5

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

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

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

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

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

于 2013-09-02T14:41:52.010 回答
2

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

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

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

于 2013-09-02T14:40:22.957 回答
1

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

char *(*arr)[2];

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

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

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

于 2013-09-02T15:26:49.930 回答