#define和typedef的区别

1.关于typedef

  typedef为C语言的关键词,作用是为一种数据类型定义一个新名字,使用typedef目的一般有两个:

一个是给变量一个易记且意义明确的新名字:

1 typedef unsigned int UINT;

 另一个是简化一些比较复杂的类型声明:

1 typedef struct node
2 {
3     int data;
4     struct node *Lchild;
5     struct node *Rchild;            
6 }BiTNode,BiTree *;

2.关于#define

  #define是宏定义,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

用法:

1 #define PI 3.1415926

 

3.#define和typedef的区别

  先举出例子在说明。

  示例1:

1 typedef char* pStr1;
2 #define pStr2 char* 
3 pStr1 s1,s2;
4 pStr2 s3,s4;

其中s1、s2、s3都定义为char *类型,而s4为char类型。
示例2:

1 #include <stdio.h>
2 #define f(x) x*x
3 int main(void)
4 {
5     int a=6, b=2, c;
6     c = f(a) / f(b);
7     printf("%d\n", c);
8     return 0;
9 }

结果为36,经过分析计算机的计算过程为a*a/b*b。

根据示例,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

4.typedef复杂的变量声明

1 int (*func)(int *p);

func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。函数名指向该函数的代码在内存中的首地址。

typedef的功能是定义新的类型,通过typedef来简化定义:

1 typedef int (*func)(int *p)

之后可以用func来声明函数指针,如:

1 func fp;

示例程序:

 1 //#include<iostream.h>
 2 #include<stdio.h>
 3 
 4 typedef int (*FP_CALC)(int, int);
 5 //注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看
 6 int add(int a, int b)
 7 {
 8      return a + b;
 9 }
10 int sub(int a, int b)
11 {
12      return a - b;
13 }
14 int mul(int a, int b)
15 {
16      return a * b;
17 }
18 int div(int a, int b)
19 {
20      return b? a/b : -1;
21 }
22 //定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、
23 //返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址
24 FP_CALC calc_func(char op)
25 {
26      switch (op)
27       {
28      case '+': return add;//返回函数的地址
29      case '-': return sub;
30      case '*': return mul;
31      case '/': return div;
32      default:
33          return NULL;
34       }
35      return NULL;
36 }
37 int calc(int a, int b, char op)
38 {
39     FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址
40      if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果
41      else return -1;
42 }
43 void main()
44 {
45     int a = 100, b = 20;
46 
47       printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
48       printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
49       printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
50       printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
51 }

 

参考

http://www.cnblogs.com/shenlian/archive/2011/05/21/2053149.html
http://baike.baidu.com/link?url=HhLnfMTQcrQtrHoSzBa-zBzZLKo9geWY0TBEBMlr9douEHf8VkyrcOubaRer8udYKHOctu1T7lu8dgB-Qf0yOa

posted @ 2017-02-25 15:57  奇热行  阅读(1572)  评论(0)    收藏  举报