一、使用typedef声明新类型名
C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新名字。typedef声明的写法和普通的声明基本相同,只是吧typedef这个关键字出现在声明的前面。例如,下面这个声明:
1
|
char
*ptr_to_char;
|
把变量ptr_to_char声明为一个指向字符的指针。但是,在你添加关键字typedef后,声明变为:
1
|
typedef
char
*ptr_to_char;
|
这个声明把标识符ptr_to_char作为指向字符的指针类型的新名字。你可以像使用任何预定义名字一样在下面的声明中使用这个新名字。例如:
1
|
ptr_to_char a;
|
声明a是一个指向字符的指针。
使用typedef声明类型可以减少使声明变得又臭又长的危险,尤其时那些复杂的声明。而且,如果你以后觉得应该修改程序所使用的一些数据的类型时,修改一个typedef声明比修改程序中与这种类型有关的所有变量(和函数)的所有声明要容易得多。
1
2
3
4
5
|
【提示】
你应该使用typedef而不是#define来创建新的类型名,因为后者无法正确的处理指针类型。例如:
#define d_ptr_to_char char *
d_ptr_to_char a,b;
正确地声明了a,但是b却被声明为一个字符。在定义更为复杂的类型名字是,如函数指针或指向数组的指针,使用typedef更为合适。
|
摘自:《C和指针》(3.3 typedef)
二、使用typedef声明函数指针
【形式】:typedef 返回类型(*新类型)(参数表)
1
2
3
4
5
6
7
8
|
typedef
char
(*PTRFUN)(
int
);
PTRFUN pFun;
char
glFun(
int
a){
return
;}
void
main()
{
pFun = glFun;
(*pFun)(2);
}
|
typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
【示例】
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include <stdio.h>
#include <assert.h>
typedef
int
(*FP_CALC)(
int
,
int
);
//定义一个函数指针类型
int
add(
int
a,
int
b)
{
return
a + b;
}
int
sub(
int
a,
int
b)
{
return
a - b;
}
int
mul(
int
a,
int
b)
{
return
a * b;
}
int
div
(
int
a,
int
b)
{
return
b ? a/b : -1;
}
//定义一个函数,参数为op,返回一个指针,该指针类型为拥有两个int参数、
//返回类型为int的函数指针。它的作用是根据操作符返回相应函数的地址
FP_CALC calc_func(
char
op)
{
switch
( op )
{
case
'+'
:
return
add;
case
'-'
:
return
sub;
case
'*'
:
return
mul;
case
'/'
:
return
div
;
default
:
return
NULL;
}
return
NULL;
}
//最终用户直接调用的函数,该函数接收两个int整数,
//和一个算术运算符,返回两数的运算结果
int
calc(
int
a,
int
b,
char
op)
{
FP_CALC fp = calc_func(op);
if
(fp)
return
fp(a,b);
else
return
-1;
}
void
main()
{
int
a = 100, b = 20;
printf
(
"calc(%d, %d, %c) = %d\n"
, a, b,
'+'
, calc(a, b,
'+'
));
printf
(
"calc(%d, %d, %c) = %d\n"
, a, b,
'-'
, calc(a, b,
'-'
));
printf
(
"calc(%d, %d, %c) = %d\n"
, a, b,
'*'
, calc(a, b,
'*'
));
printf
(
"calc(%d, %d, %c) = %d\n"
, a, b,
'/'
, calc(a, b,
'/'
));
}
|
原文地址:http://blog.csdn.net/qll125596718/article/details/6891881
相关阅读:如何设计一门语言(一)——什么是坑(a)
*** walker ***
本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1672870如需转载请自行联系原作者
RQSLT