欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一起talk C栗子吧(第九十 二回:C语言实例--浅谈typedef)

程序员文章站 2022-05-13 16:13:19
各位看官们,大家好,上一回中咱们说的是数组大小的例子,这一回咱们说的例子是:浅谈typedef。闲话休提,言归正转。让我们一起talk C栗子吧! 最近有看官问一些关于typed...

各位看官们,大家好,上一回中咱们说的是数组大小的例子,这一回咱们说的例子是:浅谈typedef。闲话休提,言归正转。让我们一起talk C栗子吧!

最近有看官问一些关于typedfe的问题,我在这里专门做一个说明,希望对大家有帮助。

typedef是C语言的一个关键字,用来重新定义类型通俗点说叫起别名或者起绰号也可以

typedef通常有两个功能:

为了程序简洁易懂(可读性好);为了避免程序出错;

简洁易懂

关于简洁易懂,我们举一个例子:

typedef struct person
{
    int age;
    char *name;
    char flag;
}Person;

在例子中定义了一个新的类型:Person.它和struct person的效果相同,在下面的代码中

Person p1;              //定义一个结构体变量
struct person p1;      //定义一个结构体变量

在上面的例子中Person p1; 等价于 struct person p1.但是前面的写法更加简洁一些。

还记得是我们在前面的章回中介绍过后的函数;signal吗?下面是signal函数的原型

void (*signal(int signo, void (*func) (int))) (int)

我们可以定义一个新类型:

typedef void func (int);

它表示一个函数,该函数拥有一个int类型的参数,并且返回类型为void。定义好该类型后,函数signal的函数原型可以这样写:

func * signal (int signo, func *pFun);  //使用typedef定义新类型后的signal函数

现在的signal函数是不是简洁很多呢。

避免出错

关于避免程序出错,我们也举一个例子:

#include 

int main()
{
    int *p1,p2;

    int a,b;
    a = 3; 
    b = 5;

    p1 = &a;
    p2 = &b;

    printf("a = %d \n",*p1);
    printf("b = %d \n",*p2);

    return 0;
}

编译上面的程序会有编译警告和错误出现:

In function ‘main’:
typFile.c:12:5:
 warning: assignment makes integer from pointer without a cast [enabled by default]
  p2 = &b;                  //发出警告
typFile.c:15:21: error: invalid type argument of unary ‘*’ (have ‘int’)
  printf("b = %d \n",*p2);  //编译错误

其实我们是想定义两个int类型的指针,结果定义了一个指针,一个变量,为了避免这种错误,我们可以在程序中使用typedef来定义一个指针类型。具体如下:

#include 

typedef int * pInt;            //定义一个新的指针类型

int main()
{
    pInt p1,p2;                //使用新类型定义两个指针

    int a,b;
    a = 3; 
    b = 5;

    p1 = &a;
    p2 = &b;

    printf("a = %d \n",*p1);
    printf("b = %d \n",*p2);

    return 0;
}

编译该程序,刚才的警告和错误没有了,我们运行编译后的程序可以得到以下结果:

a = 3 
b = 5           //程序运行正确

各位看官,关于浅谈typedef的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。