使用typedef声明新类型及函数指针

简介:

一、使用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

相关文章
|
6月前
|
存储 C语言
文件的类型指针
文件的类型指针
58 0
|
6月前
|
编译器 C语言
void的指针类型
void的指针类型
44 0
|
6月前
|
存储 程序员 C++
在C++编程语言中指针的作用类型
在C++编程语言中指针的作用类型
63 0
|
1月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
36 0
|
5月前
|
编译器 C++
函数指针和函数对象不是同一类型怎么替换
函数指针和函数对象不是同一类型,为何可替换用作同一函数的参数
|
6月前
|
存储 安全 C语言
void指针类型详解
void指针类型详解
69 2
|
5月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
45 0
|
5月前
|
图形学 Windows
程序技术好文:记录类型指针
程序技术好文:记录类型指针
23 0