C 语言编程 — typedef 关键字

目录

typedef

typedef 顾名思义,主要用于自定义一个数据类型,而数据类型在代码中的体现为 “名字”,所以 typedef 一般的理解是为一个数据类型或变量定义一个 别名

定义数据类型别名

typedef unsigned char                                     UINT8;
typedef unsigned short                                    UINT16;
typedef unsigned int                                      UINT32;
typedef signed char                                       INT8;
typedef signed short                                      INT16;
typedef signed int                                        INT32;
typedef float                                             FLOAT;
typedef double                                            DOUBLE;
typedef char                                              CHAR;

定义无名结构体

typedef struct
{
    int a;
    char b;
    double c; 
} Simple2;

上述例子中结构体是没有声明名字的,所以称之为 “无名结构体定义”。但 typedef 的存在,又让我们得到了一个 “别名”,实际上只是单存的在代码的书写上带来了便利而已。

typedef 和 const 结合使用的陷阱

#include <stdio.h>

typedef int* PINT;

int main(void)
{
    int a = 23;
    const PINT b = &a;
    *b = 8;

    const int* c = &a;
    *c = 43;

    printf("the *b is %d\n",*b);
    return 0;
}

编译报错:

$ gcc test3.c -o test3
test3.c: 在函数‘main’中:
test3.c:13:5: 错误:向只读位置‘*c’赋值
     *c = 43;
     ^

这个错误很好理解,因为整型常量 c 指向的数值是不可变的,所以为 “只读” 位置。

但为什么使用了语句 const PINT b = &a; 却不会编译错误呢?如果我们把编译错误的语句注释掉之后,程序甚至还可以执行:

$ ./test3
the *b is 8

从结果看出,我们预期的常量被修改了。实际上,我们应该把 const PINT b = &a 看成 int* const b = &a,这条语句并非 “整型常量 b 被赋值了” 而是 “变量 b 的指针是一个常量,变量 b 被赋值了”。

这里就是陷阱了,当 typedef 和 const 结合使用时,尤其是在指针场景中,一律认为是定义一个指针常量,而非常量。下列两种写法其实是一致的:

const PINT b = &a;
PINT const c = &a; 

如果我们非要这么使用的话,那么就用 typedef 将 const 一并声明了:

typedef const int* PINT;

PINT b = &a;
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__0809 返回首页
实付 49.00元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值