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

C (int(*)[30]中的(*)是什么意思?,c,C,在C中,(int(*)[30])是什么意思?例如,在: int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20])); 粗略地说,它的意思是“是一个指针” 这意味着“b是指向30个整数数组的指针” 这意味着“强制转换为指向30个整数数组的指针”。(*)在变量名之前意味着它是指针 我们刚刚看到,存储对另一个变量的引用的变量称为指针。指针被称为“指向”它们存储引用的变量 使用指针,我们可以直接访问它所指向的变量中存储的值。要做到这一点,我们

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

int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
粗略地说,它的意思是“是一个指针”

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

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

(*)在变量名之前意味着它是指针

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


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

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

  • int(*b)[30]
  • (*b)[30]
    是一个
    int
  • (*b)
    是长度
    30
    int
    数组
  • b
    是指向长度
    30
    int
    数组的指针
无名版本
int(*)[30]
完全相同,只是省略了名称


如果您有一个C编程语言的副本,其中有一个名为
cdecl
的程序,可以将这些声明转换为英语。随着时间的推移,它有各种各样的修改,例如在Debian中,它支持匿名表单,并且是在线的。

关于
(*)
真的没有什么特别之处。因为您只是引用类型转换中的一个类型(而不是一个有名称的变量),所以您只需省略该名称。这里仍然需要参数来区分指针数组和指向数组的指针。

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

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

      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
返回的指针值视为指向
int
的30个元素数组的指针”。注意,从技术上讲,cast表达式是多余的,应该删除

malloc
调用本身似乎非常错误。您正在分配20个元素的
int
数组的30个实例,但将结果分配给指向30个元素的
int
数组的指针;那会引起问题的。假设您试图分配一个N x 30的
int
矩阵,则以下情况会更安全:

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

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

@OliCharlesworth我不是问*在C中是什么意思,我是指(*),即(int(*)[30])。@Max:啊,对不起。我没有注意到您询问的是“
(*)
”,而不是“
*
”。这意味着您正在强制转换到数组指针,因此它正在强制转换到旁注上30个整数的数组指针,永远不要在C中使用
malloc
的结果。如果忘记包含
stdlib.h
,那么就没有必要了,也可能会遇到问题。行中的另一个星号表示“乘法”。关键是
int*[30]
意味着完全不同的东西,即指向
int
的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.
int (*b)[30] = malloc(N * sizeof *b);