typedef

文章目录


typedef最初的用途就是希望C语言能用与其他语言相同的关键字定义变量
在这里插入图片描述

#include<stdio.h>
typedef int integer;//后面要加封号 

int main(void)
{
    integer a;
    int b;
    a=520;
    b=a;
    printf("%d",b);
    return 0;
}

考虑能否用define 宏定义来实现
#define integer int//不用加封号
实际上也是可以实现的
但是俩者本质不一样
反例:

#include<stdio.h>
//typedef int integer;//后面要加封号 
#define integer int;
int main(void)
{
    unsigned integer a;
    a=-1;
    printf("a=%u\n",a);
    return 0;
}

打印结果并不是-1
a=4294967295
因为-1已经被转换成了一个无符号整型
原因进制转化
尝试使用typedef

#include<stdio.h>
typedef int integer;//后面要加封号 
//#define integer int;
int main(void)
{
    unsigned integer a;
    a=-1;
    printf("a=%u\n",a);
    return 0;
}

发现会报错!
反例2,定义指针变量的情况:

#include<stdio.h>
typedef int integer;//后面要加封号 
typedef int *PTRINT;
//#define integer int;
//#define PTRINT int*
int main(void)
{
   INTEGER a=520;
   PTRINT b,c;
   b=&a;
   c=b;
   printf("addr of a=%p\n:",c);
   return 0;
}

typedef 可以正常运行,但是#define会报错
因为#define是直接替换
所以 PTRINT b,c;其实就变成int *b,c;这里就是只定义了b
而反过来 用typedef 的情况 b,c都会变成指针。
比起宏定义的直接替换,typedef是对类型的封装,对原有的数据类型起一个别名
其中还可以对一个数据类型起多个别名,如上所示。

typedef在结构体的应用

#include<stdio.h>
#include<stdlib.h>
struct Date
{
    int year;
    int month;
    int day;
};

int main()
{
    struct Date *date;
    date=(struct Date*)malloc(sizeof(struct Date));
    if (date==NULL)
    {
        exit(1);
    }
    date->year=2017;
    date->month=5;
    date->day=15;
    printf("%d-%d-%d\n",date->year,date->month,date->day);
}

到处都要写struct ,十分多余,但是又不能不写,所以可以用typedef 来对整个结构体取个别名

#include<stdio.h>
#include<stdlib.h>
typedef struct Date
{
    int year;
    int month;
    int day;
} DATE;//把struct Date 都用DATE来替代

int main()
{
    DATE *date;
    date=(DATE*)malloc(sizeof(DATE));
    if (date==NULL)
    {
        exit(1);
    }
    date->year=2017;
    date->month=5;
    date->day=15;
    printf("%d-%d-%d\n",date->year,date->month,date->day);
}

更进一步,国际上通用做法,再对结构起别名后面还应该再多一个结构体指针的别名

typedef struct Date
{
    int year;
    int month;
    int day;
} DATE,*PDATE;//把struct Date 都用DATE来替代

DATE *就可以用PDATE来替代

进阶typedef

typedef 使用的目的
1.一个是给变量起一个容易记住且意义明确的别名;
2.简化一些比较复杂的类型声明,主要还是用于声明!!
一些比较恐怖的声明语句:
int(*ptr)[3];//是一个数组指针,指针指向一个拥有三个整型元素的数组
别名
typedef int (*PTR_TO_ARRAY)[3]

#include<stdio.h>
typedef int(*PTR_TO_ARRAY)[3];

int main()
{
    int array[3]={1,2,3};
    PTR_TO_ARRAY ptr_to_array=&array;

    for(int i=0;i<3;i++)
    {
        printf("%d\n",(*ptr_to_array)[i]);
    }
    
    return 0;
}

2.int(*fun)(void)//函数指针,后面跟着的是小括号就是函数
typedef int(*PTR_TO_FUN)(void);

#include<stdio.h>
typedef int(*PTR_TO_FUN)(void);

int fun(void)
{
    return 520;
}


int main()
{
    PTR_TO_FUN ptr_to_fun=&fun;
    printf("%d\n",(*ptr_to_fun)());
    return 0;
}

int *(*array[3])(int);
array[3])就是一个指针数组,intA(int);
用typedef 简化
typedef int *(*PTR_TO_FUN)(int);
PTR_TO_FUN array[3];//存放指针,指向三个函数的地址

#include<stdio.h>
typedef int*(*PTR_TO_FUN)(int);

int *fun1(int num)
{
    return &num;
}
int *fun2(int num)
{
    return &num;
}
int *fun3(int num)
{
    return &num;
}


int main()
{
    PTR_TO_FUN array[3]={&fun1,&fun2,&fun3};
    for(int i=0;i<3;i++)
    {
        printf("add of num:%p\n",(*array[i])(i));
    }
    return 0;
}

void (*funA(int,void(*funB)(int)))(int);
funA是一个函数
void (*funA(参数))(int);
第二个参数是一个函数指针
返回的是一个函数指针和第二个参数一样。
因此,把其和第二个参数一样进行化简

typedef void(*PTR_TO_FUN)(int);
PTR_TO_FUN funA(int,PTR_TO_FUN);

要进行还原就是把funA(int,PTR_TO_FUN)整个式子替换到typedef void(*PTR_TO_FUN)(void);中去

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值