(int (*)[30])
在C语言中是什么意思?例如,在以下代码中:
int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
(int (*)[30])
在C语言中是什么意思?例如,在以下代码中:
int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
大致意思是“是一个指针”。
int (*b)[30]
这意味着 "b
是一个指向由30个整数组成的数组的指针"。
(int (*) [30])
这意味着“将其转换为指向包含30个整数的数组的指针”。int *[30]
的意思是完全不同的,即一个包含30个指向 int
的指针的数组。 - Jonathan Lefflerint (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
分解一下:
b -- b
(*b) -- is a pointer
(*b)[30] -- to a 30-element array
int (*b)[30] -- of int.
[]
)的优先级高于一元运算符(如*
),因此T *a[]
被解释为T *(a[])
,即a
是指向T
的指针数组。要将a
指定为指向数组的指针,我们必须强制分组为T (*a)[]
。(int (*) [30])
的含义是“将malloc
返回的指针值视为指向30个元素的int
数组的指针”。请注意,严格来说,强制类型转换表达式是多余的并应该被移除。
malloc
调用本身似乎非常错误。你正在分配一个由20个元素的数组构成的30个实例,但将结果分配给一个指向30个元素的int
数组的指针;这将会导致问题。假设你要分配一个N x 30的int
矩阵,则以下代码更安全:int (*b)[30] = malloc(N * sizeof *b);
*b
的类型是int [30]
,因此sizeof *b
与sizeof (int [30])
相同。cdecl
来解决这些问题:cdecl> explain (int (*) [30])
cast unknown_name into pointer to array 30 of int
在变量名前加上(*)表示这是一个指针。
我们刚才看到,存储对另一个变量的引用的变量称为指针。指针被称为“指向”其存储其引用的变量。
使用指针,我们可以直接访问它所指向的变量中存储的值。为此,我们只需在指针的标识符之前加上星号(*),它充当解引用运算符,可以字面上翻译为“指向的值”。
(*)
并没有什么特别之处。由于您只是在类型转换中引用了一个类型(而不是该类型的变量,它有一个名称),因此您可以省略名称。在这里,括号仍然需要将指针数组与数组指针区分开来。
malloc
的结果。这是没有必要的,如果你忘记包含stdlib.h
,可能会遇到问题。 - Ed S.