[深入浅出C语言]typedef 和C关键字总结

272 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

前言

        本文就来简单地讲一下typedef关键字,顺便把C中的关键字总结一下。

        笔者水平有限,难免存在纰漏,欢迎指正交流。

typedef 的理解与使用

理解typedef

        typedef其实就是一个含义:类型重命名,相当于给原类型起一个“别名”。

        那原来的类型名还可以用吗?还是说就用新起的名替代掉原来类型名了吗?注意一下“别名”一词,何谓别名?就好比你小时候别人给你起的小名,无论是你的小名还是原名,不都能用来称呼你嘛。总而言之就是,typedef给某个类型多起一个名字,无论起多少个别名,原名称和别名作用效果都一样。

使用typedef

  1. 对一般类型进行重命名

typedef unsigned int u_int;

  1. 对结构体类型进行重命名
typedef struct stu
{
    int n;
    char ch;
    double df;
}stu;
  1. 对指针进行重命名

typedef int* int_p;

  1. 对数组进行重命名
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个)

  1. 循环控制(5个)

for :一种循环语句

do :循环语句的循环体

while :循环语句的循环条件

break :跳出当前循环

continue :结束当前循环,开始下一轮循环

  1. 条件语句(3个)

if : 条件语句

else :条件语句否定分支

goto :无条件跳转语句

  1. 开关语句 (3个)

switch :用于开关语句

case :开关语句分支

default :开关语句中的“其他”分支

  1. 返回语句(1个)

return :函数返回语句(可以带参数,也看不带参数)

存储类型关键字(5个)

auto :声明自动变量,一般不使用

extern :声明变量是在其他文件中声明

register :声明寄存器变量

static :声明静态变量

typedef :用以给数据类型取别名(但是该关键字被分到存储关键字分类中,虽然看起来没什么相关性)

其他关键字(3个)

const :声明只读变量

sizeof :计算数据类型长度

volatile :说明变量在程序执行中可被隐含地改变


以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~

src=http___c-ssl.duitang.com_uploads_item_201708_07_20170807082850_kGsQF.thumb.400_0.gif&refer=http___c-ssl.duitang.gif