因为我找不到任何能解释int(*p)[5];
的阅读,所以我决定在这里问一个问题,这个问题也可以作为其他用户使用时的参考,因为我觉得它有点混乱。int*(*asex)[5];
到底是什么?
我是自学成才的,但我也从来没有在各种不同的课程中看到过它的解释,我也从来没有在实践中使用过它。现在,我需要一个明确的解释,因为我正在为我的项目创建一个C代码分析器。即使它没有直接向我解释,我已经习惯了语言语义,所以这里是我认为它的意思:
int(*a)[5];
一个指向5个整型数组的指针(指针指向int[5]
)int(**asex)[5];
指针指向一个包含5个int指针的数组?int(*arr[10])[10];
应该是指向int[10]
的10个指针的数组int*(*asex)[5];
这是什么?指针指向int[5]
的指针?
我错了什么?另外,我觉得这唯一真实的的优点是用指针算术显示出来的,是真的吗?
1条答案
按热度按时间tvmytwxo1#
阅读这些定义有一个窍门:螺旋法。
1.从标识符开始:变量定义的变量名、typedef的类型名以及匿名类型(如强制类型转换)的最内层
*
。1.从左到右解析后缀运算符(对于数组为
[]
,对于函数为()
),如果到达)
,则跳到下一个规则1.然后从右到左解析前缀运算符,
*
表示指向1.当您到达
(
时,跳回到步骤2以取得括号中的运算式。1.如果到达最后一个类型停止。
将此应用于示例:
int(*a)[5];
定义了一个指向5个整型数组的指针。通常,该类型由一个函数接收,该函数接受一个定义为int mat[4][5]
的矩阵;int(**asex)[5];
定义了一个指向5个int数组的指针。上面定义的函数参数的地址类型。int(*arr[10])[10];
定义了一个由10个指针组成的数组,指向由10个int组成的数组。可以存储10个指针,指向具有10列和不同行数的矩阵。int*(*asex)[5];
定义了一个指向int的5个指针数组的指针。下面是最后一个示例的详细步骤:
在
int*(*asex)[5]
中,从asex
开始,asex
是一个,向右看,命中)
,从asex
重新开始,向左看,*
读作指针指向,命中(
,从)
重新开始,向右看,[5]
读作数组5,点击;
,从(
重新开始,向左看,*
发音为指针指向,int
,发音为最后一个类型**int
**。因此有这样一句话:*
asex
是指向int
* 的5个指针数组的指针。