#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

浙公网安备 33010602011771号