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类型的函数。
首先来看一下不合法的声明:
.函数的返回值不能是一个函数, 所以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类型的函数。
相关文章推荐
- C专家编程学习笔记——第三章:C语言的声明(一)
- C专家编程学习笔记——第三章(三):有效地解读C语言的声明
- c专家编程笔记之第三章分析c语言的声明
- 【c专家编程】分析c语言的声明
- C专家编程-分析C语言的声明
- C专家编程——分析C语言的声明
- C专家编程-Chapter3 C语言声明分析2
- 【C专家编程】第3章 分析C语言的声明
- C语言中声明及定义的区别:【C专家编程】
- C专家编程:用python写cdecl程序,以分析C语言程序的声明语句
- [C专家]分析C语言声明——关于联合
- 《C专家编程》笔记二:第三章 分析C语言的声明
- C语言学习趣事_BT_C_Code_混乱编程代码分析_1
- [C专家]分析C语言声明——声明是如何形成的[1]
- C专家编程—分析signal函数的原型声明{void (*signal(int sig,void (*func)(int)))(int)}(2)
- C专家编程精华篇----头疼的C语言声明:const、typedef、define及函数高级声明
- [C专家]分析C语言声明——关于枚举
- C语言学习趣事_BT_C_Code_混乱编程代码分析_2
- [C专家]分析C语言声明—— 关于结构体
- C专家编程-Chapter3 C语言声明