有一个名为“顺时针/螺旋法则”的技术,可以帮助任何 C 程序员在脑海中解析任何 C 声明!
有三个简单的步骤需要遵循:
+-------+ | +-+ | | ^ | | char *str[10]; ^ ^ | | | +---+ | +-----------+我们要问自己的问题:str 是什么?
“str 是一个…
“str 是一个大小为 10 的数组,它…
“str 是一个大小为 10 的数组,它指向…
“str 是一个大小为 10 的数组,它指向 char 指针”
+--------------------+ | +---+ | | |+-+| | | |^ || | char *(*fp)( int, float *); ^ ^ ^ || | | | +--+| | | +-----+ | +------------------------+我们要问自己的问题:fp 是什么?
“fp 是一个…
“fp 是一个指向…
“fp 是一个函数指针,它接受一个 int 和一个指向 float 的指针作为参数,并返回…”
“fp 是一个函数指针,它接受一个 int 和一个指向 float 的指针作为参数,并返回一个指向…”
“fp 是一个函数指针,它接受一个 int 和一个指向 float 的指针作为参数,并返回一个指向 char 的指针”
+-----------------------------+ | +---+ | | +---+ |+-+| | | ^ | |^ || | void (*signal(int, void (*fp)(int)))(int); ^ ^ | ^ ^ || | | +------+ | +--+| | | +--------+ | +----------------------------------+
我们要问自己的问题:'signal' 是什么?
请注意,signal 在括号内,所以我们必须首先解析它!
“signal 是一个函数,它接受一个 int 和一个…”
fp 是一个指向…
“fp 是一个函数指针,它接受一个 int 作为参数并返回…”
“fp 是一个函数指针,它接受一个 int 作为参数并返回 void(无)”
“signal 是一个函数,它接受一个 int 和一个指向函数的指针(该函数接受一个 int 作为参数并返回 void)作为参数,并返回…”
“signal 是一个函数,它接受一个 int 和一个指向函数的指针(该函数接受一个 int 作为参数并返回 void)作为参数,并返回一个指向…”
“signal 是一个函数,它接受一个 int 和一个指向函数的指针(该函数接受一个 int 作为参数并返回 void)作为参数,并返回一个指向函数的指针(该函数接受一个 int 作为参数并返回…”
“signal 是一个函数,它接受一个 int 和一个指向函数的指针(该函数接受一个 int 作为参数并返回 void)作为参数,并返回一个指向函数的指针(该函数接受一个 int 作为参数并返回 void)”
对于 const 和 volatile 也应用相同的规则。例如:
const char *chptr;
“chptr 是一个指向常量 char 的指针”
这个怎么样
char * const chptr;
“chptr 是一个指向 char 的常量指针”
最后
volatile char * const chptr;
“chptr 是一个指向 volatile char 的常量指针。”
请使用 K&R II 第 122 页上的示例来练习此规则。
本文可以自由分发,但必须保留作者姓名和本声明。