char * (*arr)[2]
和char **array[2]
如何彼此不同?如果我使用函数传递char* strings[2]
,那么如何从问题的第一部分提到的方式访问元素?
还请告诉其他方法来访问指针数组的元素。
感谢。
答案 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::vector
和std::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
没有评估,因此给出了数组大小。