如何区分
char * (*arr)[2]
和char **array[2]
?假设我正在使用函数传递char* strings[2]
,则如何从问题第一部分提到的两种方式中访问元素?还请告诉其他访问指针数组元素的方法。谢谢。 char * (*arr)[2]
和char **array[2]
?假设我正在使用函数传递char* strings[2]
,则如何从问题第一部分提到的两种方式中访问元素?还请告诉其他访问指针数组元素的方法。谢谢。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
这只是因为[]
数组声明符的优先级高于*
指针限定符,所以括号会改变含义。
&&
和 ||
运算符(在 SO 上有很多关于这个问题的问题,如果你感兴趣可以阅读其中之一)。 - user529758Follow 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^
。 - P0W*
-- 你觉得怎样? - Hoganchar * (*arr)[2]
是一个指向指针数组的指针。
char **array[2]
是指针到指针的数组。
如果我使用一个函数传递
char* strings[2]
,那么如何从问题的第一部分中提到的两种方式访问元素?
strings
是指针数组,所以 &strings
给出了第一种类型。你不能从中得到第二种类型。
在 C++ 中,我建议您停止使用奇怪的复合类型,而是使用类似于 std::vector
和 std::string
的高级数组类。
char **array[2]
是一个指向指针的指针的两个元素数组。
char *(*arr)[2]
是一个指向指向字符指针的两个元素数组的指针。
注意:在C语言中,指向字符的指针可以作为字符串使用,需要以null结尾。
char *(*arr)[2];
所以在括号内部,' *arr '表示" arr 是一个指针",从右往左看。
括号内没有剩余内容,因此"arr是一个指针"适用于剩下的部分,从右往左看:一个包含两个指向字符的指针的数组。
我一直觉得有一个类似的简短规则非常有用,即“C数组的值是其第一个元素的指针”--这也突显了使用名称的值和其他属性之间的区别:f(arr)
和arr + 1
都使用 arr
的值,在每种情况下,它的值都是指向其第一个元素的指针(带有其数组特性和范围),但例如 sizeof arr
不会被评估,因此会给出数组大小。