我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言中typedef的用法以及#define区别详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言中typedef的用法以及#define区别详解

1、简洁定义

C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。而编程中起别名,是为了编程人员编程方便,例如:

定义如下结构体


struct stu
{
	int ID;
	char name[20];
	float score[3];
	char *data;
};

要想定义一个结构体变量就得这样写:


struct stu Marry;//Marry是定义的新结构体学生

这个地方可以用我们今天的主题语法:typedef,来减少定义时需要的字符,来完成目的,如下:


typedef struct stu
{
	int ID;
	char name[20];
	float score[3];
	char *data;
}STU;
//定义一个Marry学生结构体
STU Marry;

可以看到非常简单的定义字符,完成结构体定义,另外typedef也可以用于已有类型,为已有类型起一个新的名字。

2、为已有类型起别名

typedef 的用法一般为:

typedef oldName newName;

例如如下,为int起名 Integer:


typedef int MY_int;
MY_int a, b;
a = 1;
b = 2;

这里 MY_int a, b ; 等同于 int a, b;

typedef 还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子:

为字符数组起别名

typedef char ARRAY20[20];

表示 ARRAY20 是类型char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:

ARRAY20 a1, a2, s1, s2;

结果如下,可以看到ARRAY20 定义的数组长度是20个字符。

因此 ARRAY20 a1, a2, s1, s2; 等价于 char a1[20], a2[20], s1[20], s2[20]; ,即数组也是有类型的,例如char a1[20];定义了一个数组 a1,它的类型就是 char [20]。

为指针起别名

为指针类型定义别名,例如如下:

typedef int (*ptr_to_arr)[4];

表示 ptr_to_arr是类型int * [4]的别名,它是一个二维数组指针类型。接着可以使用 ptr_to_arr定义二维数组指针:

ptr_to_arr p1, p2;

这代表p1, p2都是二维数组指针,同样也可以为函数指针类型定义别名:


typedef int (*ptr_to_func)(int, int);
ptr_to_func pfunc;

如下表示为指针类型和函数类型起别名:


#include <stdio.h>

typedef char (*ptr_to_arr )[30];
typedef int (*ptr_to_func )(int, int);

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

char str[3][30] = {
    "Happy New Year",
    "Good Good Study",
    "Day Day up"
};

int main(){
    ptr_to_arr parr = str;//parr 代表一个二维数组指针,指向str这个二维数组对应元素
    ptr_to_func  pfunc = max;//pfunc代表一个函数指针,指向max函数
    int i;
   
    printf("max: %d\n", (*pfunc)(10, 20));
    for(i=0; i<3; i++){
        printf("str[%d]: %s\n", i, *(parr+i));
    }

    return 0;
}

结果如下:

需要强调的是,typedef 是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。

3、typedef 和 #define 的区别

typedef 在表现上有时候类似于 #define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把 typedef 看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。例如如下情况:

1)能否使用其他类型说明符对宏类型名进行扩展

用unsigned 配合 #define定义的变量,可以使用:


#define MY_int int
unsigned MY_int n;  //没问题

但是用unsigned 配合 typedef 定义的变量,则不可以使用:


typedef int MY_int ;
unsigned MY_int n;  //错误,不能在 MY_int 前面添加 unsigned

表明了typedef 的完整性。

2)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。例如:


#define My_int int *
My_int p1, p2;

//如果用宏替换则变为:

int *p1, p2;

这样会使, p1、p2 成为不同的类型,p1为指向int类型的指针,p2为int类型数据。

对于typedef定义的别名,不存在上述的情况,例如:


typedef int * PTR_INT
PTR_INT p1, p2;

p1、p2 类型相同,它们都是指向 int 类型的指针。

总结

到此这篇关于C语言中typedef的用法以及#define区别的文章就介绍到这了,更多相关C语言typedef及#define区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言中typedef的用法以及#define区别详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

c语言中typedef和define的区别是什么

这篇文章主要介绍“c语言中typedef和define的区别是什么”,在日常操作中,相信很多人在c语言中typedef和define的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c语言中typed
2023-06-25

C语言中*和&的区别及使用方法详解

在 c 语言中, 用于解引用指针,返回指向的值;&amp;amp;amp;amp;amp;amp; 用于取地址,返回指向该变量的指针。 通常用于访问或修改指针所指向的值;&amp;amp;amp;amp;amp;amp; 通
C语言中*和&的区别及使用方法详解
2024-04-03

C语言goto的应用举例以及详解

goto的用法就是改变程序执行的顺序,从某个地方跳转到你标志的地方,下面这篇文章主要给大家介绍了关于C语言goto的应用举例及详解的相关资料,需要的朋友可以参考下
2022-11-13

C语言中宏和函数的9个区别详解

C语言中的宏和函数是非常相似的,它们都可以完成类似的功能。本文为大家整理了C语言中宏和函数的9个区别,感兴趣的小伙伴可以跟随小编一起了解一下
2023-05-14

C语言中auto,register,static,const,volatile的区别详细解析

以下是对C语言中auto,register,static,const,volatile的区别进行了详细的分析介绍,需要的朋友可以过来参考下
2022-11-15

C语言中go out的用法详解

在C语言中,"go out"是一个常用的术语,指的是函数的退出和返回值的传递。在本文中,我们将详细解释C语言中"go out"的用法,并提供具体的代码示例。在C语言中,函数的返回值通过return语句传递给调用函数。return语句用于终
C语言中go out的用法详解
2024-03-14

+=在C语言中的作用及示例详解

+=运算符在c语言中是一个复合赋值运算符,它将变量的值与其自身加上一个给定值相加,从而修改变量的值。使用方法:将变量 += 常量/变量/表达式;,其中变量是可以修改的值,常量是不可修改的值,表达式是可以求值的任何表达式。+=运算符在C语言中
+=在C语言中的作用及示例详解
2024-04-03

详解C语言中strcpy函数与memcpy函数的区别与实现

这篇文章主要介绍了C语言中字符串拷贝函数(strcpy)与内存拷贝函数(memcpy)的不同及内存拷贝函数的模拟实现,感兴趣的小伙伴可以跟随小编一起学习一下
2022-12-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录