C语言的陷阱之typedef

typedef是一个关键字,可以重命名一些数据类型也可以重定义一些新的数据类型。我们从以下几个角度去理解typedef。

1.typedef和普通数据类型类型

typedef int MYINT;int a = 10;
MYINT B = 20;123123

我们给int重命名成MYINT,这时候 int 和MYINT 是一样的,都可以定义变量,并且在32位平台都是32位的。

2.typedef和结构体(重点)

struct people 
{    int age;    char sex;
};1234512345

上面创建了一个新的数据类型 strcut people,注意,这个是数据类型,数据类型不占内存。

struct people p1,p2;11

这时候我们定义了两个变量,p1和p2,他们的数据类型是struct people,以后我们每次定义变量都要写struct people,是不是感觉很麻烦,使用typedef给它重命名一下就简单多了。

typedef struct people
{    int age;    char sex;
}STRPEO; 1234512345

这样struct people和STRPEO和struct people就有了一样的作用。以后我们在定义变量直接STRPEO p1,p2;是不是简单很多。 
我们再来定义一个该结构体的指针

typedef struct people 

int age; 
char sex; 
}*PSTRPEO;

虽然* 和PSTRPEO很近,但是* 是和struct people 结合的,也就是说,PSTRPEO 的类型是struct people *

STRPEO P1;          //定义结构体变量P1.age = 20;        //给结构体age成员赋值PSTRPEO P = &p1;    //使用结构体指针访问age成员printf("%d\n",p->age);      //结果是  20  12341234

3.typedef和#define(重点) 
typedef是给类型重命名,相当于一个数据类型,而#define是宏定义,在程序预处理时期直接替换

typedef int * PMYINT;

MYINT a,b;      123123

相当于 int* a,int* b,两个变量的数据类型都是int *

#define PMYINT int *PMYINT a,b;123123

* 宏定义是直接替换,在这就是用 int替换掉PMYINT 相当于int a,b;a是int类型,b是int类型。**

4.typedef和const(重点)

回顾:const int * p; //指针p指向的变量是不可变得 
int * const p; //指针p本身是不可改变的

typedef int* PINT;const PINT p1;
PINT const p2;12341234

按照我们平常的理解应该是const int* p1;和int *const p2;p1指向的变量是不可变的,p2指针本身是不可变的。经过代码验证我们发现,无论是const PINT p1;还是PINT const p2; 效果都等价于 int *const ,p1和p2本身是不可变的。 那我们想让指针指向的变量不可变怎么办?

typedef const int* CPINT;

CPINT P1,CPINT P2;      //这样p1和p2本身可变,指向的变量不可变。123123

5.typedef和函数指针

函数:int * test(const char *,int ); 
函数指针 int* ( * ptest)(const char * ,int )

我们每次定义这类函数的指针都要写这么长,很麻烦于是

typedef int * ( * PTEST)(const char * ,int);

以后我们在使用该函数指针时直接PTEST P1,P2;就可以了。

6.使用typedef的意义 
使用typedef的好处就是简化类型的书写,创建与平台无关的数据类型,有利于代码移植,int在32位机器上就是32位的,在我们在32位机器上写的程序很可能无法在64位平台运行,我们可以把int用typedef重定义一下,即可增强代码的可移植性。

时间: 2024-08-24 22:28:32

C语言的陷阱之typedef的相关文章

C语言第四讲,typedef 关键字,以及作用域

C语言第四讲,typedef 关键字,以及作用域 一丶typedef关键字 在C语言中,有typedef 关键字,这个关键字的作用就是允许你为类型定义一个新的名字,也就是 起个别的名字 例如: typedef unsigned int DWORD 那么以后,我们定义unsigned int 类型的变量的时候,这不用敲写 unsigned int 了.直接DWORD即可. 例如: DWORD name = 0; 一般常常用在 结构体的定义,和函数指针上. 例如: typedef struct My

C语言进阶——enum, sizeof, typedef 分析11

枚举类型的使用方法: enum是C语言的 一种自定义类型 enum值是可以根据需要自定义的整型值 第一个enum的值默认为0 默认情况下的enum值是在前一个定义值的基础上加 1 enum类型的变量只能去定义时的离散值 1 enum Color 2 { 3 GREEN, 4 BLUE, 5 RED 6 }; 7 8 enum Color c = GREEN; 9 10 printf("%d\n",c); 枚举类型的特殊意义: enum中定义的值是C语言真正意义上的常量 在工程中enum

c语言预处理指令、typedef、static和extern相关介绍

一:typedef 作用:可以给一个已经存在的数据类型取一个别名 格式:typedef 原数据类型  新类型   例如:typedef   int  INT; 预处理指令#define 也可以给数据类型取别用用法:  #define  INT  int; //1.用在基本数据类型上 int a = 10; typedef int TNT; typedef char CHAR; CHAR c='A'; //65 TNT b = 100; //2.给数组起别名 char ch[5]; typedef

C语言学习分享(typedef、变量)

typedef 对已知数据类型定义一个新名字 1.对数据类型更名       //int .float.char.double typedef intInteger;       //对int 类型进行更名为Integer Integer i = 10;              //直接用Integer进行类型定义相当于int 给指针起别名 typedef char*string;    string str ="Hellow"; 2.对函数指针进行更名 typedef int (*

宏定义陷阱与typedef

#define int_ptr int* int_ptr point1,point2; 经预处理后,第二行变为 int * point1,point2. 这就意味着,point1 是一个指向int的指针,但是 point2却是 int类型的了. 所以,宏定义的连续变量的定义中 ,不能保证所有的变量为同一样的类型!! typedef不同,他可以保证连续性. typedef char * String String str1,str2; -------------------------------

C语言学习入门 (九) typedef 关键字

关键字:typedef 用法:为各种数据类型定义一个新名字(别名) typedef与基本数据类型 typedef int Integer;Integer a= 8: 也可以在别名的基础上再起一个别名 typedef IntegerMyInteger;MyInteger aa = 8; 原来的数据类型也可以正常使用 typedef与指针 typedef char *String;String str = "stone"; typedef与结构体 typedefstructPerson P

C语言学习入门 (八) typedef 关键字

关键字:typedef 用法:为各种数据类型定义一个新名字(别名) typedef与基本数据类型 typedef int Integer;Integer a= 8: 也可以在别名的基础上再起一个别名 typedef IntegerMyInteger;MyInteger aa = 8; 原来的数据类型也可以正常使用 typedef与指针 typedef char *String;String str = "stone"; typedef与结构体 typedefstructPerson P

就算是C语言的陷阱吧?

2014年11月02日22:39:07 晚间测试 int ch[] = {97, 97, 97, 0}; puts(ch); if (strcmp("AAA", ch)) { printf("real?true!"); }

C语言学习分享(typedef、变量))

宏定义 #define MAX 5 #define SUM (10 +5) #define kSum(a, b) (a + b)   // Sum(a, b)中间不能加空格 printf("kSum is %d\n", kSum(10, 5)); //调用 int a = 5; #if MAX == 5 printf("max is 0\n"); #elif MAX > a   此处a的值为0  未进行编译时a未进行赋值默认为0, printf("m