在 C 中是什么(int (*)[30])
意思?例如,在:
int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
大致意思是“是一个指针”。
int (*b)[30]
这意味着“b
是一个指向 30 个整数数组的指针”。
(int (*) [30])
这意味着“转换为指向 30 个整数数组的指针”。
int (*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.
在声明和表达式中,后缀运算符 like[]
比一元运算符 like 具有更高的优先级*
,因此T *a[]
被解释为T *(a[])
; IOW,a
是一个指针数组T
。要指定a
一个指向数组的指针,我们必须强制分组T (*a)[]
。
类似地,强制转换表达式的(int (*) [30])
意思是“将返回的指针值malloc
视为指向 30 元素数组的指针int
”。请注意,从技术上讲,强制转换表达式是多余的,应该删除。
malloc
调用本身似乎非常错误。您正在分配 20 元素数组的 30 个实例int
,但将结果分配给指向 ; 的 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
真的没有什么特别的(*)
。由于您只是在类型转换中引用一个类型(而不是具有该类型名称的变量),因此您只需省略该名称。这里仍然需要括号来区分指针数组和指向数组的指针。
变量名前的 (*) 表示它是一个 POINTER。
我们刚刚看到,存储对另一个变量的引用的变量称为指针。据说指针“指向”它们存储其引用的变量。
使用指针,我们可以直接访问存储在它指向的变量中的值。为此,我们只需在指针的标识符前面加上一个星号 (*),它充当解引用运算符,可以直译为“指向的值”。