C语言指针与数组复杂声明浅谈

本文主要为了解释《C程序设计语言 第二版》101页一个比较复杂的变量声明语句,在日常编程中很少遇见如此复杂的变量声明语句,书中推荐在进行复杂的变量声明时使用typedef。
那个复杂的变量声明语句到底长什么样。
char (*(*x())[])()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//函数如何定义
char a();

//类型为 函数 的 指针 如何定义(函数指针)
char (*b)();

//类型为 char 的 数组 如何定义(char数组)
char c[2];

//类型为 函数指针 的 数组 如何定义(函数指针数组)
char (*(d[2]))();

//类型为 数组 的 指针 如何定义(数组指针)
char (*e)[];

//类型为 函数指针的数组 的 指针 如何定义(函数指针数组指针)这个名字也是没谁了。。。。
char (*((*f)[]))();

//包含函数指针的数组的指针如何定义,因为[]优先级比*高,所有可以省略一个括号
char (*(*g)[])();

//x是一个指针,它指向一个一维数组,数组里包含多个函数指针,函数指针指向返回值是char的函数
char (*(*x)[])();

//最后三个定义f、g、x为同一种数据类型

这种复杂声明语句的难点在于,C语言中运算符[]和()优先级最高从左向右结合,运算符*优先级低从右向左结合,C语言语法中“不同运算符结合顺序和优先级的不规律”导致容易出错。

要遵循运算符的优先级和结合顺序,每一步都小心翼翼。

将C语言转换为文字描述时,先根据定义语句写出类似于“返回一个指针,指针指向一个数组,数组中是指针,指针指向函数,函数返回……”,然后再精简成“返回一个指针,指针指向一个函数指针数组……”,也可以继续变态精简为“返回一个函数指针数组指针……”。

反之亦然。

C语言指针与数组复杂声明浅谈

https://blog.zscself.com/posts/3f9f1a7a/

作者

F!redent

发布于

2017-03-16

更新于

2024-01-30

许可协议

CC BY-NC-SA 4.0

评论