struct和typedef都是自定义数据类型,用于在基础类型不够的情况下,基于自己的需要自己定义的特定数据类型
typedef
typedef即type define 也就是类型的定义,使用它可以将一些基础数据类型的类型名另起一个通俗易懂的别名(只能对现有的类型名起别名并不能生成一个新的数据类型) 比如:
int main()
{
typedef int index;
int temp[10] = { 0 };
for (index i = 0; i < 10; i++)
{
temp[i] = i;
}
return 0;
}
通过给变量int类型起一个别名index,使用的时候直接用index定义变量,可以很直观地看出这个变量是用来干嘛的。
使用typedef还可以将一些过于复杂的类型定义简化:
typedef struct Student{
char name[20];
char sex[3];
char tel[11];
}Stu;
int main()
{
struct Student stu1;
Stu stu2;
strcpy(stu1.name,"张三");
strcpy(stu2.name, "李四");
printf("stu1:%s stu2:%s", stu1.name, stu2.name);
getchar();
return 0;
}
如图,使用typedef后可以直接使用Stu来声明结构体struct Student
define
宏定义:主要用来对一些常量进行统一定义
比如:
#include<stdio.h>
#define MAXSIZE 20
int main()
{
int a[MAXSIZE] = { 0 };
char b[MAXSIZE] = { 0 }
getchar();
return 0;
}
这样以后就可以直接用MAXSIZE代替20,如果以后MAXSIZE的值需要改变的话,直接在宏定义修改,所有使用到MAXSIZE的地方都会相应修改,就不需要一个一个修改了。即方便了操作又有一定含义可以直观了解这个数是用来干嘛的,比如看到MAXSIZE就可以知道它是代表最大的尺度。
关于typedef和#define用法的不同
1.顺序的不同 #define后面紧跟着的是替换后的别名 再后面才是要替换的内容 而typedef恰好相反:
#define ULONG1 unsigned long
typedef unsigned long ULONG2;
int main()
{
ULONG1 m;
ULONG2 n;
m = 4;
n = 4;
printf("m=%u n=%u",m,n);
getchar();
}
2.使用typedef给变量起别名时要在末尾加上分号,而用#define给变量起别名时不能在后面加分号,否则在使用别名声明变量时: ULONG1 m; 就等于unsigned long; m; 因为#define只是做了一个简单的替换,并非是从编译器层面完成的这件事
在对数据类型使用宏定义时,只是进行简单的替换,并不会像typedef那样可以使用别名直接当作数据类型名定义变量。
比如:
#include<stdio.h>
#define PINT int *
typedef char* PCHAR;
int main()
{
PINT a, b;
PCHAR c, d;
int n1 = 1, n2 = 2;
char c1 = '1', c2 = '2';
a = &n1;
b = &n2;
c = &c1;
d = &c2;
getchar();
return 0;
}
这里就会出现警告:
b = &n2;
/*这句报错:int与int* 的间接级别不同 说并这里的b的类型是int而不是我们期望的int*类型。这是因为宏定义只是简单的替换
PINT a, b; ---》这句等同于int *a,b; 只将a声明为了指针类型!
所以对于对数据类型另起名的操作不提倡使用#define,最好使用typedef。*/