当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > C语言中的typedef新解

C语言中的typedef新解 时间:2018-09-28      来源:未知

很多朋友在用C语言做项目过程中都遇到过一些比较特殊的数据类型,比如:uint32_tpid_t   pthread_t等。

在C的标准语法中并没有给出这样的基本类型,那么这些类型是怎么来的呢,用相关工具去跟踪源码会发现,这些类型其实是通过关键字typedef定义的,那么typedef的功能是什么,又是如何定义类型的呢?下面就给大家介绍一下本人的见解。

首先,typedef关键字主要是用来做什么的?很多朋友觉得是用来定义一个新的类型,这种理解是不正确的,typedef在C语言中其实是用来给一个已经存在的类型定义一个新的别名,有三个目的:第一,简化用原类型定义数据在格式上的复杂性;第二,就是“望名生意”,比如: typedef int pid_t;    便于在编写程序过程中对相关类型的理解;第三,就是提高程序的可移植性,比如:typedef unsigned int uint32_t;  用uint32_t定义变量,我们就能够很容易理解这么变量是32位无符号的整型数据,可以提高该数据的移植性,如果用unsigned int定义变量,在不同的系统下可能长度会不同。

那么如何用typedef给类型定义新的别名呢?下面给出一个经典的方法。

总的来说,分为两个步骤:

第一步:写出原类型定义数据的语句格式,例如:

int a;      //a为整型变量

int * pa;      //pa为整型指针

int arr[5];      //arr为有5个整型元素的数组

int (*arrp)[3];      //arrp为指向有3个整型元素数组的指针

void (*funp)(int);      //funp为指向一个整型参数的函数的指针,该函数没有返回值

第二步:在第一步中各语句前加“typedef”

typedef int a; //a为整型int的别名

typedef int * pa;      //pa为整型指针类型int*的别名

typedef int arr[5];      //arr为有5个整型元素的数组类型的别名

typedef int (*arrp)[3];      //arrp为指向有3个整型元素数组的指针类型的别名

typedef void (*funp)(int);      //funp为指向一个整型参数的函数的指针类型的别名

有了上面的定义之后,下面的定义就是正确的

a  a1;      //a1为整型变量

pa  pa1;      //pa1为整型指针

arr   array      //array为有5个整型元素的数组

arrp    arrayp      //arrayp为指向有3个整型元素数组的指针

funp    fp;      //fp为指向一个整型参数的函数的指针,该函数没有返回值

以上就是本人对typedef的一点见解,如有不同意见可以一起探讨。下面给出一些代码实例,进一步理解上面的方法。

实例1:

#include <stdio.h>

 

//unsigned int b;

typedef unsigned int uint;

uint b;

 

//int a;

typedef int x;

x  a;

 

//int *pa,*pb,*pc;

typedef int* intp;

intp pa,pb,pc;

 

int main(void)

{

      a = 123;

      pa = &a;

      pb = pa;

      pc = pa;

      printf("a = %d\n",a);

      printf("*pa = %d\n",*pa);

      printf("*pb = %d\n",*pb);

      printf("*pc = %d\n",*pc);

      b = 1200;

      printf("b = %d\n",b);

      return 0;

}

实例2:

#include <stdio.h>

 

//typedef int (*)[3] arrp;

typedef int (*arrp)[3];

 

int main(void)

{

      //int (*p1)[3];   //p指向有3个元素的数组的指针

      arrp p1;

      int i;

      int a[3] = {1,2,3};

      

      p1 = &a;

      for(i = 0; i < 3; i++)

   printf("%d\t",(*p1)[i]);

      printf("\n");

      return 0;

}

实例3:

#include <stdio.h>

 

typedef int c; //c为int新的名称

typedef int a,b;  //a,b为int新的名称

typedef int d,*p; //d为int的别名,p为int*别名

 

int main(void)

{

      c c1 = 100;

 

      p  p1 = &c1;

 

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

      return 0;

}

上一篇:S5PV210 上mjpg_streamer的移植

下一篇:内存问题检测工具的介绍

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部