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

6

(int (*)[30])在C语言中是什么意思?例如,在以下代码中:

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

@OliCharlesworth,我不是在问 C 语言中 * 的含义,我特别指的是 (*),即 (int (*) [30])。 - Max
@Max:啊,抱歉。我没注意到你在问“()”,而不是“”。 - Oliver Charlesworth
这意味着您正在将其转换为指向包含30个整数的数组的指针的数组指针。 - Yet Another Geek
顺便提一下,在C语言中不要强制转换malloc的结果。这是没有必要的,如果你忘记包含stdlib.h,可能会遇到问题。 - Ed S.
6个回答

14

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

int (*b)[30]

这意味着 "b 是一个指向由30个整数组成的数组的指针"。

(int (*) [30])
这意味着“将其转换为指向包含30个整数的数组的指针”。

3
这行中的另一个星号代表“乘”。 - John Fisher
2
一个关键点是,int *[30] 的意思是完全不同的,即一个包含30个指向 int 的指针的数组。 - Jonathan Leffler

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[]),即a是指向T的指针数组。要将a指定为指向数组的指针,我们必须强制分组为T (*a)[]
同样地,强制类型转换表达式(int (*) [30])的含义是“将malloc返回的指针值视为指向30个元素的int数组的指针”。请注意,严格来说,强制类型转换表达式是多余的并应该被移除。 malloc调用本身似乎非常错误。你正在分配一个由20个元素的数组构成的30个实例,但将结果分配给一个指向30个元素的int数组的指针;这将会导致问题。假设你要分配一个N x 30的int矩阵,则以下代码更安全:
int (*b)[30] = malloc(N * sizeof *b); 

表达式*b的类型是int [30],因此sizeof *bsizeof (int [30])相同。

2
如何解析C声明和类型:从外到内展开它们。
  • int (*b)[30]
  • (*b)[30] 是一个 int
  • (*b) 是一个长度为 30int 数组。
  • b 是一个指向长度为 30int 数组的指针。

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

如果您有 The C Programming Language 的副本,则其中有一个名为 cdecl 的程序,可以将这些声明转换为英语。随着时间的推移,它已经有了各种修改,例如 Debian 中的 cutils 支持无名称形式,cdecl.org 在线上也提供此服务。


2
您可以使用 cdecl 来解决这些问题:
cdecl> explain (int (*) [30]) 
cast unknown_name into pointer to array 30 of int

0

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

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

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


0

(*)并没有什么特别之处。由于您只是在类型转换中引用了一个类型(而不是该类型的变量,它有一个名称),因此您可以省略名称。在这里,括号仍然需要将指针数组与数组指针区分开来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接