(int (*)[30])
在C中意味着什么?例如,在:
int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
答案 0 :(得分:11)
大致意思是“是一个指针”。
int (*b)[30]
这意味着“b
是指向30个整数数组的指针”。
(int (*) [30])
这意味着“强制转换为指向30个整数数组的指针”。
答案 1 :(得分:3)
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)[]
。
Simlilarly,强制转换表达式(int (*) [30])
表示“将malloc
返回的指针值视为指向30个元素int
数组的指针”。请注意,从技术上讲,强制转换表达式是多余的,应该删除。
malloc
电话本身似乎非常错误。您正在分配30个{-1}}的20个元素数组的实例,但是将结果分配给指向30个元素int
的数组的指针;这会引起问题。假设您正在尝试分配int
的N x 30矩阵,以下将更安全:
int
表达式int (*b)[30] = malloc(N * sizeof *b);
的类型为*b
,因此int [30]
与sizeof *b
相同。
答案 2 :(得分:2)
如何解析C声明和类型:从外部展开它们。
int (*b)[30]
。(*b)[30]
是int
。(*b)
是一个int
长度为30
的数组。b
是指向长度为int
的{{1}}数组的指针。无名版本30
完全相同,只是省略了名称。
如果您有C编程语言的副本,那里有一个名为int (*) [30]
的程序可以将这些声明转换为英语。随着时间的推移对它进行了各种修改,例如Debian中的cutils支持无名形式,cdecl.org在线。
答案 3 :(得分:1)
您可以使用cdecl
来解决这些问题:
cdecl> explain (int (*) [30])
cast unknown_name into pointer to array 30 of int
答案 4 :(得分:0)
(*)表示是一个POINTER。
我们刚刚看到一个存储对另一个变量的引用的变量称为指针。指针被指向"指向"他们存储引用的变量。
使用指针我们可以直接访问存储在它指向的变量中的值。要做到这一点,我们只需要在指针的标识符前面加上一个星号(*),它用作解引用运算符,并且可以直接转换为""指向"的值。
答案 5 :(得分:0)
(*)
真的没有什么特别之处。由于您只是引用了类型转换中的类型(而不是具有该类型名称的变量),因此您只需省略该名称即可。这里仍然需要parens来区分指针数组和指向数组的指针。