如何char * (*arr)[2]
和char **array[2]
彼此不同?如果我char* strings[2]
使用函数传递,那么如何从问题第一部分中提到的两种方式访问元素?还请告诉其他访问指针数组元素的方法。谢谢。
5 回答
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
只是[]
数组声明符的优先级高于*
指针限定符,所以括号改变了含义。
遵循螺旋规则:-
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
所以,知道找出差异
char * (*arr)[2]
是指向指针数组的指针。
char **array[2]
是指向指针的指针数组。
如果我
char* strings[2]
使用函数传递,那么如何从问题第一部分中提到的两种方式访问元素?
strings
是一个指针数组,所以&strings
给出第一种类型。你不能从中得到第二种类型。
在 C++ 中,我建议您停止使用奇怪的复合类型,而使用更高级别的类似数组的类,例如std::vector
and std::string
。
char **array[2]
是指向字符指针的 2 元素数组。
char *(*arr)[2]
是一个指向字符指针的二元素数组的指针。
注意。当 null 终止时,指向字符的指针可以用作 C 中的字符串。
我一直觉得有用的规则是“由内而外,从右到左”:
char *(*arr)[2];
所以里面首先,paren组有'*arr',从右到左是“arr是一个指针”
parens 中没有任何内容,因此“arr 是指向其余部分的指针”,从右到左:一个由两个指向 char 的指针组成的数组。
我一直觉得有用的一条类似的简短规则是说“C 数组的值是指向其第一个元素的指针”——这也突出了名称用于其值和其他属性之间的区别:f(arr)
和arr+1
两者都使用arr
's 的值,并且它在每一个中的值都是指向其第一个元素的指针(其数组和边界被剥离),但 egsizeof arr
不评估,因此给出了数组大小。