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;
}

类型typeof Client上不存在属性getMultiProperties_typedef


如图,使用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();
}

类型typeof Client上不存在属性getMultiProperties_数据_02

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;
}

这里就会出现警告:

类型typeof Client上不存在属性getMultiProperties_数据类型_03

b = &n2;
    /*这句报错:int与int* 的间接级别不同   说并这里的b的类型是int而不是我们期望的int*类型。这是因为宏定义只是简单的替换
    PINT a, b;  ---》这句等同于int *a,b; 只将a声明为了指针类型!
    所以对于对数据类型另起名的操作不提倡使用#define,最好使用typedef。*/