一、typedef VS #define

在开始说明typedef关键字之前,我想先试着区分一下typedefdefine宏定义。例如:

/*#define 形式*/
#define COUNT int
/*typedef形式 */
typedef int COUNT;

typedef与**#define**有相似之处,上述两条语句的作用都是用COUNT代替int。但是事实上,他们二者是不同的。#define 是在预编译时处理的,它只能做简单的字符串替换,二typedef是在编译时处理的,实际上,它并不是作简单的字符串替换,而是采用如同定义变量的方法那样来声名一个类型。

  • 案例1:
/*使用typedef方式*/
typedef int COUNT,*PCOUNT;
int main()
{COUNT a = 520;PCOUNT b,c;b = &a;c = b;printf("address of a = %p\n",&a);printf("address of a = %p\n",b);printf("address of a = %p\n",c);
}
  • 案例2:
/*使用#define方式*/
#include <stdio.h>
#include <stdlib.h>
#define COUNT int
#define PCOUNT int*
int main()
{COUNT a = 520;PCOUNT b,c;b = &a;c = b;printf("address of a = %p\n",&a);return 0;
}

案例2虽然也能编译成功,但是会出现这样一个警告,大意就是b是指针变量,而c是一个int变量,两种不同类型的变量理论上是不能赋值的!

  • 但为什么会出现警告呢?
  • 因为#define只是单纯地进行文本替换,所以PCOUNT<=>int*,PCOUNT b,c<=>int b,c*;是不是似曾相识,这不就是我们定义一个指针变量,一个int变量的写法吗!

二、基础typedef

废话不说,直接案例说明!

typedef为变量起别名

  • 案例3:
typedef int COUNT,*PCOUNT;
int main()
{COUNT a = 520;PCOUNT b,c;b = &a;c = b;printf("address of a = %p\n",&a);printf("address of a = %p\n",b);printf("address of a = %p\n",c);
}

typedef为结构体起别名

  • 案例4:
#include <stdio.h>
#include <stdlib.h>
typedef struct Date
{int year;int month;int day;
}DATE,*PDATE;int main()
{PDATE time; // PDATE time<=>DATE* time<=>struct Date* timetime = (PDATE)malloc(sizeof(DATE));printf("请输入年份:");scanf("%d",&time->year);printf("请输入月:");scanf("%d",&time->month);printf("请输入日:");scanf("%d",&time->day);printf("%d-%d-%d",time->year,time->month,time->day);return 0;
}

一文搞懂C语言typedef关键字相关推荐

  1. 一文搞懂C语言回调函数

    转载自:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 博主:Rdou Typing 来源:segmentfault ...

  2. c语言字符串截取_一文搞懂 C 语言 #、##、__VA_ARGS__

    1'#' 和 '##' 属于预处理标记.'#' 和 '##' 用于类似函数的宏定义中(或者简称为宏定义函数).2'__VA_ARGS__' 是 C99 引入的用于支持宏定义函数中使用可变参数. 操作符 ...

  3. 一文搞懂C语言如何用指针来代替变量和数组进行数据的存储

      众所周知,指针的用法最常见的无外乎两种,一种是用指针来指向变量的内存地址,通过操控指针进而可以间接的操控变量.另外一种是把指针当成变量来使用,像变量一样可以存储数据.数组也是类似的道理,因为数组实 ...

  4. 一文搞懂C语言文件操作

    一.文件分类 根据数据的组织形式,可以将文件分为文本文件和二进制文件.通俗讲,文本文件就是你能看懂的,而二进制文件是你看不懂的! 二.文件打开与关闭 假设已经定义了一个文件指针 FILE *fp; 有 ...

  5. 一文搞懂Go语言的plugin

    要历数Go语言中还有哪些我还没用过的特性,在Go 1.8版本[1]中引入的go plugin[2]算一个.近期想给一个网关类平台设计一个插件系统,于是想起了go plugin^_^. Go plugi ...

  6. 【C语言】一文搞懂C语言文件操作

    文章目录 0. 前言 1. 为什么使用文件? 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件信息区 3.2 文件指针 3.3 文件的打开和关 ...

  7. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  8. 一文搞懂transient关键字

    一文搞懂transient关键字 1.序列化 1.1 什么是序列化 1.2 以文件存储为例实现序列化 2.transient关键字 2.1 添加transient关键字 2.2 静态变量不需要加tra ...

  9. 面试官问你斐波那契数列的时候不要高兴得太早 搞懂C语言函数指针 搜索引擎还可以这么玩? 那些相见恨晚的搜索技巧...

    面试官问你斐波那契数列的时候不要高兴得太早 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归求斐波那契数列 递归,在数学与计算机 ...

最新文章

  1. 2011年中国程序员薪水调查报告
  2. 【STM32】FreeRTOS 任务切换
  3. class std::vectorclass std::basic_stringchar,struct std::char_traitschar,class std::allocatorch
  4. 排序算法以及其java实现
  5. 大学期末c语言作业演示,大学C语言期末考试练习题(带详解答案)
  6. 记录一次SQL优化,增加索引,随便写的当笔记了
  7. 设置熄屏_刚买的手机微信收不到信息提醒耽误事情,手机到手一定要这样设置...
  8. 在scrapy中parse函数里面xpath的内容打印不出来_如何正确的使用Scrapy ?
  9. JAVA内部类示例分析
  10. 华为厉害了:已启动6G网络技术研究
  11. java线程池相关总结
  12. 盐城哪里学计算机表格,盐城办公自动化周末班
  13. ubuntu安装hexo博客
  14. 6自由度机械臂的建立
  15. Error parsing INI config file: the argument ('true??') for option 'logappend' is invalid.
  16. 服务器2003设置共享文件夹共享文件夹,WinServer2003 文件夹共享 方法设置
  17. 手机html在哪个文件里,手机相册在哪个文件夹,教您手机图片存放在哪里
  18. 读取计算机内存卡,手机内存卡无法读取怎么办 读取手机内存卡详细方法【详细步骤】...
  19. matlab里newc,Matlab超简单教程
  20. 中国汽车原始设备制造商的厂内物流市场趋势报告、技术动态创新及市场预测

热门文章

  1. 数据库设计中,多对多关系使用使用逗号分割关联讨论
  2. CSS3属性之text-overflow:ellipsis,指定多行文本中任意一行显示...
  3. JAVA --BYTECODE
  4. 2017.3.24组合数学学习——容斥原理
  5. ASP.NET %%,%=%,%#%区别
  6. linux 下启动jar小程序
  7. IIS下的FTP使用
  8. .net中关键字new的用法
  9. Go(GoLang)解决 cannot find package/golang.org/问题 Grpc+ProtoBuf所需的一些资源
  10. linux查看服务器网络状态