您的位置:首页 > 编程语言 > C语言/C++

C专家编程学习之第三章——分析C语言的声明

2012-09-01 09:34 267 查看
第三章:声明

首先来看一下不合法的声明:

.函数的返回值不能是一个函数, 所以foo()()是非法的。

.函数的返回值不能是一个数组, 所以foo()[]是非法的。

.数组里面不能有函数, 所以foo[]()是非法的。

但下面的说法则是正确的:

.函数的返回值可以是一个函数指针, 如int (*fun())().

.函数的返回值可以是一个指向数组的指针,如 int (*fun())[].

.数组里面允许有函数指针, 如 int (*fun[])().

在结构体中,有时我们会看到位段,无名字段以及字对齐所需的填充字段。如

struct pid_tag

{

unsigned int inactive : 1;

unisnged int : 1;

short pid_id;

};

位段的类型必须是int unsinged int或者signed int(或者加上限定符)。至于int位段的值可不可以取负值取决于编译器。位段在系统编程和单片机编程中会看到。

一般情况下,我们不赞成使用把声明和变量的定义混合在一起,如:

struct veg

{

int a;

char b;

}veg_a, veg_b;

一般用

struct veg

{

int a;

char b

};

struct veg veg_a, veg_b;

说到结构体, 跟结构体相似的有union(联合)和枚举(enum);

注意:枚举里面的标识符的值是 常量。

下面,来分析一下C语言中声明一例:

char * const * (*next) ();

这个到底表示什么呢?我们一步一步来分析:

1/首先看变量next,看到(*next),所以很明显, next是一个指针。

2/再看 (*next) ()可知,next是一个指向...的函数指针。

3/再看函数的返回值 char *const *, 可知函数的返回值是一个指针,该指针指向一个char类型的常量指针。

4/结合起来就是:next是一个指针,它指向一个函数,该函数的返回一个指针,该指针指向的是一个类型为char的常量指针。

再看一下下面的例子:

char *(* c[10]) (int **p)

1/首先c是一个数组,数组元素为指针。

2/指针指向一个参数为(int **p), 返回值为char *的函数。

3/所以,c是一个具有10个元素的数组,数组里面的元素为指针, 该指针指向一个函数,该函数的参数为(int **p),返回值为char *;

说到这里,就要讲一下著名的signal()函数了,来看一下它的原型:

void (*signal (int sig, void (*func) (int))) (int);

是不是有点胆战心惊的感觉,^_^

来分析一下:

1/signal是一个函数,它有两个参数, 一个是int类型, 一个是一个函数指针,该函数指针指向一个参数为int类型,返回值为空的函数。

2/signal的返回值是一个函数指针,该函数指针指向一个参数为int类型,返回值为void类型的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: