C语言语法 typedef小结

在总结typedef之前,先了解一个专业术语:
常量指针(const pointer):常量指针在定义的时候必须被初始化,而且一旦初始化完成,则它的值就不能再改变。

int errNumb = 0;
int *const curErr = &errNumb;  // curErr将一直指向errNumb,不可以改变。
1.typede是什么。

类型别名(type alias)是一个名字,它是某种类型的同义词。使用类型别名有很多好处,它可以让复杂的类型名字变得简单明了、易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的。
传统的方法是使用关键字typedef:

typedef double wages;    // wages是double的同义词
typedef wages base, *p;  // base是double的同义词,p是double *的同义词

其中,关键字typedef作为声明语句中的基本类型的一部分出现。含有typedef的声明语句定义的不再是变量而是类型别名。和以前的普通基本类型声明一样,这里的声明也可以包含类型修饰,从而也能由基本类型构造出符合类型来。

2.如何理解使用typedef来给基本数据类型起一个别名。

如果某个类型别名指代的是复合类型或常量,那么,把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名:

typedef char *pstring;
const pstring cstr = 0;  // cstr是指向char的常量指针
const pstring *ps;       // ps是一个指针,它的对象是指向char的常量指针

上述两条声明语句的基本数据类型都是const pstring,和过去一样,const是对给定的类型的修饰。pstring实际上是指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。

遇到一条使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来的样子,以理解该语句的含义:

const char *cstr = 0;    // 是对const pstring cstr的错误理解

再强调一遍:这种理解是错误的。声明语句中用到pstring时,其基本数据类型是指针。可是用char重写了声明语句后,数据类型就变成了char, 而成为了声明符的一部分。这样的改写显然是错误的。这样改写的结果是,const char 成了基本数据类型。前后两种声明含义截然不同,前者声明了一个指向char的常量指针,改写后的形式则声明了一个指向const char的普通指针。

我写的测试代码如下:

#include <stdio.h>

typedef char *pstring;

int main(char argc, char *argv[]) {
    char a = 'h', b = 'f';
    pstring cstr = NULL;
    const char *t = NULL;
    cstr = &a;
    const pstring pa, pb = &b;
    t = &a;
    pa = &a;    // compile error: assignment of read-only variable 'pa'

    printf("hello world
");
    return 0;
}
3.如何理解typedef给函数指针类型起一个别名。

在我们平时写代码的过程中,我们虽然不能定义一个函数类型的行参,但是行参可以是指向函数的指针。此时,行参看起来是函数类型,实际上却是当成指针使用:

// 第三个行参是函数类型,它会自动转换成指向函数的指针
void useBigger(const char *s1, const char *s2, 
                bool pf(const char *, const char *));
// 等价的声明:显式地将行参定义成指向函数的指针
void useBigger(const char *s1, const char *s2,
                bool (*pf)(const char *, const char *));

我们可以直接把函数作为实参使用,此时它会自动转换成指针:
// 自动将函数函数lengthCompare转换成指向该函数的指针
useBigger(s1, s2, lengthCompare);
正如useBigger的声明语句所示,直接使用函数指针类型显得冗长而繁琐。我们可以通过typedef来加以简化使用了函数指针的代码:

// Func是函数类型
typedef bool Func(const char *, const char *);

// FuncP是指向函数的指针
typedef bool (*FuncP)(const char *, const char *);

我们使用typedef定义自己的类型。Func是函数类型,而FuncP是指向Func类型函数(函数原型,形如Func)的指针类型。

参考:

《C++Primer中文第5版》:Page56,60,61,222

转载本Blog文章请注明出处,否则,本作者保留追究其法律责任的权利。 本人转载别人或者copy别人的博客内容的部分,会尽量附上原文出处,仅供学习交流之用,如有侵权,联系立删。
原文地址:https://www.cnblogs.com/drfxiaoliuzi/p/6003580.html