(int(*)[30])中的(*)是什么意思?

时间:2012-04-09 20:02:37

标签: c

(int (*)[30])在C中意味着什么?例如,在:

int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));

6 个答案:

答案 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来区分指针数组和指向数组的指针。