C/C++学习笔记25:用typedef定义类型

除了可以直接使用C提供的标准类型名和自己声明的结构体、共用体、指针等类型外,还可以用typedef声明新的类型名来代替已有的类型名。我们还是从一个面试题来分析typedef的用法:

写出下面代码的输出内容:

#include <stdio.h>   
int inc(int a)   
 { return(++a); }
   
int multi(int*a,int*b,int*c)   
 {   return(*c=*a**b); }  
typedef int(FUNC1)(int in);   
typedef int(FUNC2) (int*,int*,int*);  
void show(FUNC2 fun,int arg1, int*arg2)  
{    
 <span style="white-space:pre">	</span>FUNC1 p=&inc;   
  <span style="white-space:pre">	</span>int temp =p(arg1);   
  <span style="white-space:pre">	</span>fun(&temp,&arg1, arg2);   
  <span style="white-space:pre">	</span>printf("%dn",*arg2);   
 }   
 main()   
{   
  int a;          //局部变量a为0;
  show(multi,10,&a);    
   return 0; 
} 
我们先不对例题进行分析,我们先来说明下具体的使用:

typedef struct
{
int month;
int day;
int year;
}DATE;

声明了一个新的类型名DATE,它代表上面指定的一个结构体类型。这时就可以用DATE来定义变量:

DATE birthday;
DATE *p;

可以不可以更复杂一点呢?

(1)

typedef int NUM[100]; //声明NUM为整型数组类型
NUM n; //定义n为整型数组变量
(2)
typedef  char *STRING; //声明STRING为字符指针类型
STRING p,s[10]; //p为字符指针变量,s为指针数组
(3)

typedef int (*POINTER)();//声明POINTER为指向函数的指针类型,该函数返回整型值
POINTER p1,p2; //p1,p2为POINTER类型的指针变量


问题一:typedef与#define有什么区别?


#define是在预编译时处理的,它只能做简单的字符串替换,而typedef是在编译时处理的。实际上并不是做简单的字符串替换。而是用“类型声明一个类型”,就是采用定义变量的方法那样来声明一个类型。


利用上面的所有知识来分析开头的源代码:



#include <stdio.h>   
int inc(int a)   
 { return(++a); }
   
int multi(int*a,int*b,int*c)   
 {   return(*c=*a**b); }  
typedef int(FUNC1)(int in);   //声明FUNC1为一个函数类型
typedef int(FUNC2) (int*,int*,int*);  //声明FUNC2为一个函数类型
void show(FUNC2 fun,int arg1, int*arg2)  // 传递函数的时候,把multi传递给了fun 
{    
 	FUNC1 p=&inc;   
  	int temp =p(arg1);   
  	fun(&temp,&arg1, arg2);   
  	printf("%dn",*arg2);   
 }   
 main()   
{   
  int a;          //局部变量a为0;
  show(multi,10,&a);    
   return 0; 
} 

所以结果是:110

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值