C语言自定义数据类型:用typedef声明新类型名

参考原文链接:https://blog.csdn.net/qq_57342311/article/details/129616215

除了可以直接使用 C 提供的标准类型名(如 int,char,float, double 和 long 等)和程序编写者自己声明的结构体、共用体、枚举类型外,还可以用 typedef 指定新的类型名来代替已有的类型名。有以下两种情况

目录

一、简单地用一个新的类型名代替原有的类型名

二、命名一个简单的类型名代替复杂的类型表示方法

三、拓展

一、简单地用一个新的类型名代替原有的类型名
例如:

typedef int Integer;        //指定用Integer为类型名,作用与int相同
typedef float Real;            //指定用Real为类型名,作用与float相同
指定用 Integer 代表 int 类型,Real 代表 float。这样,以下两行等价:

int i,j;         float a,b;
Integer i,j;     Real a,b;
这样可以使熟悉 FORTRAN 的人能用 Integer 和 Real 定义变量,以适应他们的习惯。

又如在一个程序中,用一个整型变量来计数,则可以命名 Count 为新的类型名 代表 int 类型:

typedef int Count;        //指定Count代表int
Count i,j;                //用Count定义变量i和j,相当于int i,j;
将变量 i,j 定义为 Count 类型,而 Count 等价于 int,因此 i,j 是整型。在程序中将 i,j 定义为 Count 类型,可以使人更一目了然地知道它们是用于计数的。

二、命名一个简单的类型名代替复杂的类型表示方法
从前面已知,除了简单的类型(如 int,float 等)、C 程序中还会用到许多看起来比较复杂的类型,包括结构体类型、共用体类型、枚举类型、指针类型,数组类型等,如:

float* [];                //指针数组
float(*)[5];            //指向5个元素的一维数组的指针
double* (double*);        //定义函数, 函数的参数是double* 型数据, 
                        //即指向double数据的指针, 函数返回值也是指向double数据的指针
double (*)();            //指向函数的指针, 函数返回值类型为double
int* (*(*)[10];)(void);    //指向包含10个元素的一维数组的指针, 数组元素的类型为函数指针
                        //(函数的地址), 函数没有参数, 函数返回值是int指针
有些类型形式复杂,难以理解﹐容易写错。C允许程序设计者用一个简单的名字代替复杂的类型形式。例如:

(1)命名一个新的类型名代表结构体类型:

typedef struct
{
    int month;
    int day;
    int year;
} Date;
以上声明了一个新类型名Date,代表上面的一个结构体类型。然后可以用新的类型名 Date 去定义变量,如:

Date birthday;        //定义结构体类型变量 birthday,不要写成struct Date birthday;
Date* p;            //定义结构体指针变量p,指向此结构体类型数据
(2)命名一个新的类型名代表数组类型

typedef int Num[100];    //声明Num为整型数组类型名
Num a;                    //定义a为整型数组名,它有100个元素
(3)命名一个新的类型名代表指针类型

typedef char* String;    //声明String为字符指针类型
String p, s[10];         //定义p为字符指针变量,s为字符指针数组


(4)命名一个新的类型名代表指向函数的指针类型

typedef int (*Pointer)();    //声明Pointer为指向函数的指针类型,该函数返回整型值
Pointer pl, p2;                //p1,p2为Pointer类型的指针变量

归纳起来,声明一个新的类型名的方法是:

①先按定义变量的方法写出定义体( 如:int i; )。

②将变量名换成新类型名( 例如:将 i 换成 Count )。

③在最前面加 typedef ( 例如:typedef int Count )。

④然后可以用新类型名去定义变量。

简单地说,就是按定义变量的方式,把变量名换上新类型名,并且在最前面加 typedef,就声明了新类型名代表原来的类型。

以定义上述的数组类型为例来说明:

①先按定义数组变量形式书写:int a[100]。

②将变量名a换成自己命名的类型名:int Num[100]。

③在前面加上 typedef,得到 typedef int Num[100]。

④用来定义变量:Num a; 相当于定义了:int a[100];

同样,对字符指针类型,也是:

char* p;                //定义变量p的方式
char* String;            //用新类型名String 取代变量名p
typedef char* String;    //加typedef
String p;                //用新类型名String定义变量,相当char* p;
习惯上,常把用 typedef 声明的类型名的第 1 个字母用大写表示,以便与系统提供的标准类型标识符相区别。

三、拓展
(1)以上的方法实际上是为特定的类型指定了一个同义字(synonyms)。

例如:

typedef int Num[100];
Num a;                        //Num是int[100]的同义词,代表有100个元素的整型数组
typedef int (*Pointer)();
Pointer pl;                    //Pointer是int(*)()的同义词。代表指向函数的指针类型,函数值为整型
用 typedef 声明的新类型称为原有类型的 typedef 名称。

(2)用 typedef 只是对已经存在的类型指定一个新的类型名,而没有创造新的类型。例如,前面声明的整型类型 Count,它无非是对 int 型另给一个新名字。又如:

typedef int Num[10];
无非是把原来用 “ int a[10]; ” 定义的数组类型用一个新的名字 Num 表示。无论用哪种方式定义变量,效果都是一样的。

(3)用 typede f声明数组类型、指针类型、结构体类型、共用体类型、枚举类型等,使得编程更加方便。例如定义数组,原来是用

int a[10], b[10], c[10], d[10];
由于都是一维数组,大小也相同,可以先将此数组类型命名为一个新的名字Arr,即:

typedef int Arr[10];
然后用 Arr 去定义数组变量:

Arr a, b, c, d;            //定义5个一维整型数组,各含10个元素
Arr 为数组类型,它包含 10 个元素。因此,a,b,c,d 都被定义为一维数组,各含 10 个元素。

可以看到,用 typedef 可以将数组类型和数组变量分离开来,利用数组类型可以定义多个数组变量。同样可以定义字符串类型、指针类型等。

(4) typedef 与 #define 表面上有相似之处,例如:

typedef int Count;

# define Count int;
从表面看它们的作用都是用 Count 代表 int。但事实上,它们二者是不同的。#define 是在预编译时处理的,它只能作简单的字符串替换,而 typedef 是在编译阶段处理的。实际上它并不是作简单的字符串替换,例如:

typedef int Num[10];
Num a;
并不是用 “ Num[10] ” 去代替 “ int ”,而是采用如同定义变量的方法那样先生成一个类型名(就是前面介绍过的将原来的变量名换成类型名),然后用它去定义变量。

(5)当不同源文件中用到同一类型数据(尤其是像数组、指针、结构体、共用体等类型数据)时,常用 typedef 声明一些数据类型。可以把所有的 typedef 名称声明单独放在一个头文件中,然后在需要用到它们的文件中用 #include 指令把它们包含到文件中。这样编程者就不需要在各文件中自己定义 typedef 名称了。

(6)使用 typedef 名称有利于程序的通用与移植。有时程序会依赖于硬件特性,用 typedef 类型就便于移植。例如,有的计算机系统 int 型数据占用两个字节,数值范围为-32768~32767,而另外一些机器则以 4 个字节存放一个整数,数值范围为 ±21亿。

如果把一个 C 程序从一个以 4 个字节存放整数的计算机系统移植到以 2 个字节存放整数的系统,按一般办法需要将定义变量中的每个 int 改为 long,将 “ int a,b,c; ” 改为 “ long a,b,c;”,如果程序中有多处用 int 定义变量,则要改动多处。现可以用一个 Integer 来代替 int :

typedef int Integer;
在程序中所有整型变量都用 Integer 定义。在移植时只须改动 typedef 定义体即可:

typedef long Integer;
————————————————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FormLink)

提供静态卡片交互组件,用于静态卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件。 说明: 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件仅可…

6.【Linux】进程间通信(管道命名管道||简易进程池||简易客户端服务端通信)

介绍 进程间通信的方式 1.Linux原生支持的管道----匿名和命名管道 2.System V-----共享内存、消息队列、信号量 3.Posix------多线程、网路通信 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。…

Android存储概念及路径解析

Android存储概念及路径解析 在Android开发领域,理解不同的存储类型及其对应的文件系统路径对于设计和实现应用至关重要。本文将深入探讨内部存储、外部存储、内存和缓存的概念,并阐明storage/sdcard与mnt/sdcard的区别,以及/storage/emulate…

【C++刷题】优选算法——动态规划第一辑

1.状态表示是什么?简答理解是dp表里的值所表示的含义怎么来的?题目要求经验题目要求分析问题的过程中,发现重复子问题 2.状态转移方程dp[i]......细节问题:3.初始化控制填表的时候不越界4.填表顺序控制在填写当前状态的时候&#…

腾讯云免费服务器配置大全和个人企业申请流程,2024年新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

蓝桥杯每日一题——棋盘

问题描述 小蓝拥有 n xn 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)请输出所有操作做完后棋盘上每个棋子的颜色。输入格式 输入的…

【每日前端面经】2024-03-17

【每日前端面经】2024-03-17 本期重点 —— Promise 欢迎订阅我的前端面经专栏:每日前端面经 Tips:每日面经更新从 2-22 到 3-15 已有 23 篇,最近愈发觉得内容相似度高,并且理解程度不深 于是临时停更面经,并将这些面经中的重…

卷积神经网络算法原理(卷积层,卷积运算,填充,步幅,经过卷积运算后的特征图大小,池化层,最大池化,平均池化,经过池化层运算后的特征图大小)

文章目录 卷积神经网络算法原理(卷积层,卷积运算,填充,步幅,经过卷积运算后的特征图大小,池化层,最大池化,平均池化,经过池化层运算后的特征图大小)前言1、图像的本质1.1、灰度图1.2…

Java学习笔记(16)

常见算法 查找算法 查询某个元素是否存在 二分查找(数组元素必须是有序的) package exercise;public class exercise1 {public static void main(String[] args) {int[] arr {7, 23, 797, 23, 79, 81, 103, 127, 131, 147};System.out.println(binar…

实战Python Socket编程:开发多用户聊天应用

实战Python Socket编程:开发多用户聊天应用 Python Socket 编程概述什么是Socket编程?Socket编程的应用场景Socket编程的重要性基本概念 环境准备Python版本必要的库开发环境配置调试工具 基本Socket编程创建Socket绑定Socket到端口监听连接接受连接发送…

C语言经典面试题目(七)

1、C语言中如何进行内存对齐和字节对齐? 在C语言中,内存对齐和字节对齐是为了优化内存访问速度和提高系统性能而进行的一种策略。内存对齐是指数据在内存中的存放位置必须是某个值的倍数,通常是数据类型的大小。字节对齐是指数据在内存中的存…

24.第12届蓝桥杯省赛真题题解

A.空间&#xff08;100%&#xff09; 计算机存储单位计算 1TB2^10 GB 1GB2^10 MB 1MB2^10 KB 1KB2&10 B 1B8 bit(bit位二进制的最小的存储单位) #include <iostream> #include <cmath>using namespace std; //2^28B 2^2int main(){std::ios::sync_with_stdio…

【C语言入门】浮点型数据在内存中的存储

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 ​编辑 引言 引例 一、浮点型在内存中的存储方式 1.1 …

在idea中配置tomcat服务器,然后部署一个项日

1.下载tomcat Tomcat下载 点击右边的tomcat8 找到zip点击下载 下载完&#xff0c;解压到你想放置的路径下 2.配置环境变量 打开设置找到高级系统设置点击环境变量 点击新建&#xff0c;变量名输入&#xff1a;CATALINA_HOME&#xff0c;变量值就是Tomcat的安装路径&#x…

【QT+QGIS跨平台编译】之七十七:【QGIS_Gui跨平台编译】—【错误处理:字符串错误】

文章目录 一、字符串错误二、处理方法三、涉及到的文件一、字符串错误 常量中有换行符错误:(也有const char * 到 LPCWSTR 转换的错误) 二、处理方法 需要把对应的文档用记事本打开,另存为 “带有BOM的UTF-8” 三、涉及到的文件 src\gui\qgsadvanceddigitizingdockwidge…

智慧礼金:电子礼金薄,让礼薄更添智能,你确定不进来看看?

智慧礼金&#xff1a;电子礼金薄&#xff0c;让礼薄更添智能&#xff0c;你确定不进来看看&#xff1f; 一、重要声明二、相关介绍三、使用好处四、如何找到该小程序 随着科技的不断进步&#xff0c;传统的纸质礼金簿已经逐渐被电子化管理所取代。今天&#xff0c;我们要向大家…

Java解决完全二叉树的节点个数

Java解决完全二叉树的节点个数 01 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的…

1990-2022年各省全要素生产率数据(仅结果)

1990-2022年各省全要素生产率数据&#xff08;仅结果&#xff09; 1、时间&#xff1a;1990-2022年 2、指标&#xff1a;地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法 3、范围&#xff1a;31省 4、计算说明&#xff1a; 产出指标&#x…

【自动化测试】如何在jenkins中搭建allure

相信大家在做自动化测试过程中&#xff0c;都会用到自动化测试环境&#xff0c;目前最常见的就是通过容器化方式部署自动化测试环境&#xff0c;但对于一些测试小白&#xff0c;不是很会搭建持续集成环境&#xff0c;特别是从0-1的过程&#xff0c;需要自行搭建很多依赖环境&am…

奇数乘积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 1;int j 3;//循环运算&#xff1b;while (j < 12){//运算&#xff1b;i i * j;//改变数值&#xff1b;j 2…