持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
前言
本文就来简单地讲一下typedef关键字,顺便把C中的关键字总结一下。
笔者水平有限,难免存在纰漏,欢迎指正交流。
typedef 的理解与使用
理解typedef
typedef其实就是一个含义:类型重命名,相当于给原类型起一个“别名”。
那原来的类型名还可以用吗?还是说就用新起的名替代掉原来类型名了吗?注意一下“别名”一词,何谓别名?就好比你小时候别人给你起的小名,无论是你的小名还是原名,不都能用来称呼你嘛。总而言之就是,typedef给某个类型多起一个名字,无论起多少个别名,原名称和别名作用效果都一样。
使用typedef
- 对一般类型进行重命名
typedef unsigned int u_int;
- 对结构体类型进行重命名
typedef struct stu
{
int n;
char ch;
double df;
}stu;
- 对指针进行重命名
typedef int* int_p;
- 对数组进行重命名
typedef int a[10];//对int[10]类型重命名为a
a b;//实际上相当于int b[10];
typedef 与 #define 的区别
问题1
typedef int * ptr_t;
ptr_t p1,p2;
问:p1,p2分别是什么类型
其实都是整型指针类型。
有人就会觉得这不对吧,你看这段代码:
int *p1, p2;
p1是整型指针而p2是整型,因为每个指针变量名都需要使用一个*,而只有一个*和p1结合,没有*和p2结合,不是这样才对吗?
实际上,类型重命名后就作为一个独立的整体存在,其实可以看成是新的类型,甚至可以看成这样(不严谨的说法)
ptr_t p1, p2; //近似看成(int *) p1, p2;
总而言之就是,typedef重命名的类型名会对其后所有变量名起到相同效果。
继续来看:
#define PTR_T int*
PTR_T p1, p2;
问:p1,p2分别是什么类型
p1是整型指针而p2是整型,为什么呢?
注意:#define实质上是文本替换
也就是说在编译之前把所有ptr_t用int*替换,原来的ptr_t a, b;全部变为int *a, b;。
问题2
如何理解下面关于typedef部分的代码?
#include <stdio.h>
#define INT32 int
typedef int int32;
int main()
{
unsigned int32 a = 10; //C中typedef不支持这种类型的扩展,不能当成简单的宏替换
unsigned INT32 a = 20; //宏简单替换,可以
return 0;
}
问题3
typedef static int int32_t; //行不行
不行
存储关键字(typedef和static都是),不可以同时出现,也就是说,在一个变量定义的时候,只能有一个。
所以typedef static int int32_t 就不行
关键字总结
我们顺便总结一下我们所学的所有关键字
数据类型关键字(12个)
char :声明字符型变量或函数
short :声明短整型变量或函数
int : 声明整型变量或函数
long :声明长整型变量或函数
signed :声明有符号类型变量或函数
unsigned :声明无符号类型变量或函数
float :声明浮点型变量或函数
double :声明双精度变量或函数
struct :声明结构体变量或函数
union :声明共用体(联合)数据类型
enum :声明枚举类型
void :声明函数无返回值或无参数,声明无类型指针
控制语句关键字(12个)
- 循环控制(5个)
for :一种循环语句
do :循环语句的循环体
while :循环语句的循环条件
break :跳出当前循环
continue :结束当前循环,开始下一轮循环
- 条件语句(3个)
if : 条件语句
else :条件语句否定分支
goto :无条件跳转语句
- 开关语句 (3个)
switch :用于开关语句
case :开关语句分支
default :开关语句中的“其他”分支
- 返回语句(1个)
return :函数返回语句(可以带参数,也看不带参数)
存储类型关键字(5个)
auto :声明自动变量,一般不使用
extern :声明变量是在其他文件中声明
register :声明寄存器变量
static :声明静态变量
typedef :用以给数据类型取别名(但是该关键字被分到存储关键字分类中,虽然看起来没什么相关性)
其他关键字(3个)
const :声明只读变量
sizeof :计算数据类型长度
volatile :说明变量在程序执行中可被隐含地改变
以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~