5

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

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

6 回答 6

13

大致意思是“是一个指针”。

int (*b)[30]

这意味着“b是一个指向 30 个整数数组的指针”。

(int (*) [30])

这意味着“转换为指向 30 个整数数组的指针”。

于 2012-04-09T20:05:43.627 回答
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.

在声明和表达式中,后缀运算符 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); 

表达式的类型*bint [30],所以sizeof *b与 相同sizeof (int [30])

于 2012-04-09T21:07:08.860 回答
2

如何解析 C 声明和类型:从外向内展开。

  • int (*b)[30].
  • (*b)[30]是一个int
  • (*b)是一个int长度数组30
  • b是一个指向int长度数组的指针30

无名版本int (*) [30]完全相同,只是省略了名称。

如果你有一本 The C Programming Language 的副本,那么里面有一个名为cdecl可以将此类声明转换为英语的程序。随着时间的推移,它已经进行了各种修改,例如Debian 中的cutils支持无名形式,并且cdecl.org是在线的。

于 2012-04-09T20:07:28.533 回答
1

您可以使用cdecl来解决这些问题:

cdecl> explain (int (*) [30]) 
cast unknown_name into pointer to array 30 of int
于 2012-04-09T20:09:50.517 回答
0

真的没有什么特别的(*)。由于您只是在类型转换中引用一个类型(而不是具有该类型名称的变量),因此您只需省略该名称。这里仍然需要括号来区分指针数组和指向数组的指针。

于 2012-04-09T20:09:50.470 回答
0

变量名前的 (*) 表示它是一个 POINTER。

我们刚刚看到,存储对另一个变量的引用的变量称为指针。据说指针“指向”它们存储其引用的变量。

使用指针,我们可以直接访问存储在它指向的变量中的值。为此,我们只需在指针的标识符前面加上一个星号 (*),它充当解引用运算符,可以直译为“指向的值”。

于 2012-04-09T20:07:09.317 回答