C语言中的typedef新解

很多朋友在用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;
}

猜你喜欢

转载自blog.csdn.net/wenyue043/article/details/64129008