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