char *(* arr)[2]和char **数组[2]如何彼此不同?

时间:2013-09-02 14:33:26

标签: c++ c arrays string pointers

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

5 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:7)

关注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 * strings [2]

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

 identifier string is an array of 2
            pointers 
            to char

所以,知道弄清楚差异

答案 2 :(得分:5)

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

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

  

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

strings是一个指针数组,因此&strings给出了第一种类型。你无法从中获得第二种类型。

在C ++中,我建议你不要再使用奇怪的复合类型,而是使用更高级别的类数组,例如std::vectorstd::string

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

我一直觉得有用的规则是"内外,从右到左":

char *(*arr)[2];

所以首先,paren组有' * arr",从右到左是" arr是指针"

p p中没有任何东西,所以" arr是一个指针"到其余部分,从右到左:一个两个指向char的指针数组。

类似的短规则我总是觉得有用的是说" C数组的值是指向其第一个元素的指针" - 这也强调了名称对其价值和其他属性的使用之间的区别:f(arr)arr+1都使用arr的价值,以及每个属性的值这些是指向其第一个元素的指针(其数组ness和bounds被剥离),但是例如sizeof arr没有评估,因此给出了数组大小。