当前位置: 首页 > article >正文

17. typedef关键字的使用

一、为什么需要typedef关键字

  C 语言允许用户使用 typedef 来为一个数据类型起一个新的别名。一旦用户在程序中定义了别名,就可以在该程序中使用别名来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。

  typedef 关键字定义的名称并不是真的创造了一种数据类型,而是给已有的或者复合型的以及复杂的数据类型取一个我们更容易理解识别的别名。

二、typedef关键字的使用

  使用关键字 typedef 可以为类型起一个新的别名。typedef 的用法一般为:

typedef oldName  newName;

  其中,oldName 是类型原来的名字,newName 是类型新的名字。

2.1、基本数据类型起别名

#include <stdio.h>

typedef unsigned char uint8_t;   //无符号8位整数

int main(void)
{
    uint8_t ch = 'a';

    printf("%c\n",ch);

    return 0;
}

  当我们使用 uint8_t 时,就和使用 unsigned char 是一样的。

2.2、数组类型起别名

#include <stdio.h>

typedef int numbeArray10[10];

int main(void)
{
    int i = 0;
    numbeArray10 array = {0,1,2,3};

    for(i = 0; i < 10; i++)
    {
        printf("%d\n",array[i]);
    }
  
    return 0;
}

   其中 numberArray10 表示定义一个长度为 10 的整数数组。numberArray10 array 等价于 int array[10]。

2.3、指针数据类型起别名

#include <stdio.h>

typedef char* pointer;

int main(void)
{
    pointer p = "hello";

    printf("%s\n",p);

    return 0;
}

  我们定义了一个指针类型,当我们使用 pointer p 声明一个指针变量,就和使用 char *p 的含义是一样的。

2.4、结构体类型起别名

#include <stdio.h>

struct Person
{
    char name[20];
    int age;
};

typedef struct Person person;

int main(void)
{
    person p = {"Sakura",10};
    printf("name: %s, age = %d\n",p.name,p.age);

    return 0;
}

  我们还可以在定义结构体时顺便使用 typedef 关键字定义结构体别名。

#include <stdio.h>

typedef struct Person
{
    char name[20];
    int age;
}person;

int main(void)
{
    person p = {"Sakura",10};
    printf("name: %s, age = %d\n",p.name,p.age);

    return 0;
}

  用 typedef 给结构体起别名的时候,可以省略结构体的类型名。

#include <stdio.h>

typedef struct
{
    char *name;
    int age;
}Person;

int main(void)
{
    Person p = {"Sakura",10};
    printf("name: %s, age = %d\n",p.name,p.age);

    return 0;
}

2.5、枚举类型起别名

#include <stdio.h>

enum WEEK
{
    MONDAY = 1,
    THESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

typedef enum WEEK Week;

int main(void)
{
    Week week = WEDNESDAY;
    printf("%d\n",week);

    return 0;
}

 我们还可以在定义枚举类型时顺便使用 typedef 关键字定义枚举类型别名。

#include <stdio.h>

typedef enum WEEK
{
    MONDAY = 1,
    THESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}Week;

int main(void)
{
    Week week = WEDNESDAY;
    printf("%d\n",week);

    return 0;
}

  用 typedef 给枚举类型起别名的时候,可以省略枚举的类型名。

#include <stdio.h>

typedef enum
{
    MONDAY = 1,
    THESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}Week;

int main(void)
{
    Week week = WEDNESDAY;
    printf("%d\n",week);

    return 0;
}

2.6、函数指针起别名

#include <stdio.h>

int max(int a, int b);

int main(void)
{
    int num1 = 0,num2 = 0;
    int maxNum = 0;

    /**
     * 定义函数指针
     * func 是函数指针的别名
     * int 表示该函数指针指向的函数是返回int类型的
     * (int,int)表示该函数指针指向的函数形参是接收两个int
     * 在定义函数指针时,也可以写上形参名typedef int (*func)(int a,int b);
     * 对于函数来说,&函数名和函数名都是函数的地址
    */
    typedef int (*func)(int,int);
    func pmax = &max;

    printf("请输入两个数,中间以空格分隔:\n");
    scanf("%d%d",&num1,&num2);

    /**
     * (*pmax)(num1,num2)通过函数指针去调用函数
     * 也可以这样调用pmax(num1,num2);
    */
    maxNum = (*pmax)(num1,num2);

    printf("the max num is : %d\n",maxNum);
  
    return 0;
}

int max(int a, int b)
{
    return a>b ? a : b;
}

http://www.kler.cn/a/350227.html

相关文章:

  • 前端【7】javascript-dom操作
  • Spring WebFlux 和 Spring MVC 的主要区别是什么?
  • npm操作大全:从入门到精通
  • WPF2-在xaml为对象的属性赋值
  • < OS 有关 > 阿里云:轻量应用服务器 的使用 安装 Tailscale 后DNS 出错, 修复并替换 apt 数据源
  • leetcode 面试经典 150 题:插入区间
  • Spark 3.3.x版本中的动态分区裁剪(DPP,Dynamic Partition Pruning)的实现及应用剖析
  • 下载免费PPT模板,就上这6个网站
  • 2024全国大数据与计算智能挑战赛火热报名中!
  • Django学习-ORM_常用字段及字段选项
  • 网络层及ip报头
  • mysql 09 独立表空间结构
  • Docker-compose 单节点管理、consul 注册中心、registrator、template
  • YoloV10改进:Neck层改进|使用ContextAggregation模块改善Neck的输出特征|即插即用
  • 部署harbor问题(缺少ssl认证证书)
  • Odin插件基本使用
  • 2018 年 NLP 的 10 个令人兴奋的想法
  • Web前端高级工程师培训:封装自己的库
  • 【洛谷】AT_abc188_c [ABC188C] ABC Tournament 的题解
  • Elastic Stack--16--ES三种分页策略
  • docker使用基础
  • 【含文档】基于Springboot+Vue的白云山景点门票销售管理系统(含源码+数据库+lw)
  • 前端导出json数据函数
  • 【fisco学习记录】搭建第一个单群组联盟链
  • Redis 完整指南:命令与原理详解
  • dart-sass和node-sass的区别,使用dart-sass后可能会出现的问题