define和typedef

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值