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