[英]What does the (*) in (int (*)[30]) mean?
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.
在声明和表达式中,像[]
这样的后缀运算符比像*
这样的一元运算符具有更高的优先级,因此T *a[]
被解释为T *(a[])
; IOW, a
是指向T
的指针数组。 要将a
指定为指向数组的指针,我们必须强制分组T (*a)[]
。
同样,强制转换表达式(int (*) [30])
表示“将malloc
返回的指针值视为指向 30 元素int
数组的指针”。 请注意,从技术上讲,cast 表达式是多余的,应该删除。
malloc
调用本身似乎非常错误。 您正在为int
的 20 元素数组分配 30 个实例,但将结果分配给指向int
的 30 元素数组的指针; 那会引起问题。 假设您正在尝试分配一个 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
(*) 在变量名前表示它是一个指针。
我们刚刚看到,存储对另一个变量的引用的变量称为指针。 指针被称为“指向”它们存储其引用的变量。
使用指针,我们可以直接访问存储在它指向的变量中的值。 为此,我们只需要在指针的标识符之前加上一个星号 (*),它充当解引用运算符,可以直译为“指向的值”。
(*)
真的没有什么特别的。 由于您只是在类型转换中引用一个类型(而不是具有该类型名称的变量),因此您只需省略名称即可。 这里仍然需要括号来区分指针数组和指向数组的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.