1.typedef与#define的区别:
(1)typedef创建的符号名只限于类型,不限于值 (2)typedef由编译器解释,不是预处理器
2.typedef的四种用法
1)typedef基本数据类型取“别名” 也就是说,C语言中的所有数据类型都可以用typedef关键词来重新定义类型名
typedef unsigned int size;
typedef unsigned int16 u16;
typedef unsigned int8 u8;
2)typedef为自定义数据类型取“别名” 自定义的数据类型包括:结构体struct name{ }; 、共用体unit name { };、枚举enum { };
struct students
{
char sex;
char name[120];
int ages;
};
typedef struct students std;
int main()
{
std stu1;
stu1.name[20];
strcpy(stu1.name,"helwww");
return 0;
}
3)typedef为数组取“别名”
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
typedef char arr_name[20];
int main()
{
arr_name ane;
strcpy(ane,"helllo");
printf("%s\n",ane);
return 0;
}
4)typedef为指针取“别名”
typedef int (*PF)(int,int);
PF a=NULL;
typedef int (*PFS[4])(int,int);
PFS b={NULL};
例程:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
typedef int (*PF)(int,int);
typedef int (*PFS[4])(int, int);
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
return a / b;
}
PF judge(char buff) {
switch (buff)
{
case '+':return add;
case '-':return subtract;
case '*':return multiply;
case '/':return divide;
default :return NULL;
break;
}
}
int main()
{
char c = 0;
int a = 0;
int b = 0;
int (*function)(int, int)=NULL;
int x;
printf("请输入表达式:\n");
x=scanf("%d%c%d", &a,&c,&b);
function = judge(c);
if (function != NULL) {
printf("表达式%d %c %d = %d\n", a, c, b, function(a, b));
}else printf("表达式输入错误\n");
}
3.typedef中的陷阱
typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);
在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?
答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char* const(一个指向char的常量指针)”。即它实际上相当于“char* const”,而不是“const char*(指向常量 char 的指针)”。
|