繁体   English   中英

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

[英]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 *bsizeof (int [30])相同。

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

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

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

如果您有一份 C 编程语言,其中有一个名为cdecl的程序可以将此类声明转换为英语。 随着时间的推移对其进行了各种修改,例如 Debian 中的cutils支持无名形式,并且cdecl.org在线。

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

cdecl> explain (int (*) [30]) 
cast unknown_name into pointer to array 30 of int

(*) 在变量名前表示它是一个指针。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM