在iOS开发中,常常用typedef来为复杂的声明定义简单的别名,一致没有系统的总结过,今天就小小的总结学习下。不足及错误之处还望指正
typedef声明定义与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了。
一、typedef作用简介:
我们可以使用typedef关键字为各种数据类型定义一个新名字(别名).
例:
typedef int SINT;
typedef unsigned int SUNINT;
typedef float SFLOAT;
以上我们对int、unsigned int、float分别起了个别名,然后我们用这三个别名定义三个变量
例:
SINT i=20;
SUNINT i1=23;
SFLOAT i2=24.56;
printf("%d,%d,%.2f",i,i1,i2);
打印结果:20,23,24.56,说明和原来的类型结果是一样的。
另外,要知道的是,给类型起别名后,原来的类型仍是可以使用的,还有,我们也可以在别名的基础上再起一个别名;
例:
typedef float SFLOAT;
typedef SFLOAT FFLOAT;
二、typedef与指针
除了可以给基本的数据类型起别名,typedef也可以给指针起别名
例:
typedef char*Pstring;
然后使用下Pstring
例:
Pstring str="This is a string!";
printf("%s",str);
打印结果:This is a string!
三、typedef与结构体
1、默认情况下结构体变量的使用
定义一个结构体,例:
struct MyPoint{
float x;
float y;
};
定义结构体变量,例:
struct MyPoint point;
point.x=10.0f;
point.y=20.0f;
默认情况下,我们定义结构体变量需要带个struct关键字。
2、使用typedef给结构体起别名
例:
定义一个结构题:
struct MyPoint{
float x;
float y;
};
起别名:
typedef struct MyPoint SPoint;
定义结构体变量,例:
SPoint p;
p.x=10.0f;
p.y=10.0f;
我们给结构体MyPoint起了个别名SPoint,然后我们用SPoint定义结构体变量p,就不用再带上struct关键字了
另外,上边的给结构体起别名可以简写为下列样式
(1)定义一个结构体,顺便起别名
typedef struct MyPoint{
float x;
float y;
}Point;
(2)可以省略结构体名称
typedef struct{
float x;
float y;
}Point;
四、typedef与指向结构体的指针
typedef可以给指针、结构体起别名,当然也可以给指向结构体的指针起别名 。
定义一个指向结构体的指针并起别名,例:
typedef struct {
float x;
float y;
}SPoint;
typedef SPoint* SP;
利用指针变量访问结构体成员,例:
SPoint point={10.0f,20.0f};
SP p=&point;
printf("x=%f,y=%f",p->x,p->y);
输出结果:x=10.000000,y=20.000000
五、typedef与枚举类型
使用typedef给枚举类型起别名也可以使代码简洁。
1、默认情况下枚举变量的使用
定义枚举类型,例:
enum MySeason{
spring,
summer,
autumn,
winter
};
定义枚举变量,例:
enum MySeason season=spring;
2、使用typedef给枚举起别名
给上述枚举类型起别名,例:
typedef enum MySeason MySeason;
定义枚举变量,例:
MySeason season=spring;(此处可以省略关键字enum)
(1)定义枚举类型,并且起别名
typedef enum MySeason{
spring,
summer,
autumn,
winter
}MySeason;
(2)可以省略枚举名称
typedef enum {
spring,
summer,
autumn,
winter
}MySeason;
六、typedef与指向函数的指针
1.函数指针
定义一个sum函数,计算a和b的和,例:
int sum(int a,int b)
{
int c=a+b;
printf("%d+%d=%d",a,b,c);
return c;
}
定义一个指向sum函数的指针变量p,例:
int(*p)(int ,int)=sum;
利用指针变量p调用sum函数,例:
(*p)(500,20);
结果控制台显示:500+20=520
2、使用typedef给指向函数的指针类型起别名
给指向函数的指针类型,起了个别名叫MySum,被指向的函数接收2个int类型的参数,返回值为int类型,
typedef int (*MySum)(int, int);
定义一个指向sum函数的指针变量p ,
MySum p = sum;
利用指针变量p调用sum函数
(*p)(4, 5);
七、typedef与#define
1、先看一段代码
定义一个别名和一个宏:
typedef char* MyString;
#define KString char*
分别用上述别名和宏定义变量:
MyString mystring="This is a String !";
printf("mystring:%s",mystring);
KString kstring="This is a String !";
printf("kstring:%s",string);
可以看出两者实现效果是一样的,但是实现的方式却不一样,使用typedef是给char *定义别名为String,而使用宏则是用char *代替代码中的宏名String
2、看下面一段代码就更能体现出别名和宏的不同
定义一个别名和一个宏:
typedef char* MyString;
#define KString char*
分别用上述别名和宏定义变量:
MyString str1,str2 ;
KString str3,str4;
重点来了,注意:在这种情况下,只有str1、str2、str3才是指向char类型的指针变量,str4只是个char类型的变量。
下面简单分析一下原因:
如果连续声明两个int类型的变量,我们可以这样写:
int a, b;
上面的代码相当于:
int a; int b;
**************以此类推
typedef char *String1;
String1 str1, str2;//................................(1)
经过typedef处理后,String1也算是一种数据类型,所以(1)行的代码相当于
String1 str1;
String1 str2;
由于String1就是char *,所以上面的两行代码等于
char *str1;
char *str2;
**************再看看宏定义的情况
#define String2 char*
String2 str3, str4;................................(2)
因为宏定义纯粹是字符串替换,用char *代替String2,所以第(2)行代码相当于
char * str3, str4;
其实也就相当于:
char * str3; char str4;
可以看出,只有str4是基本数据类型,str1、str2、str3都是指针类型。所以,以后给类型起别名,最好使用typedef,而不是使用#define
所以,以后给类型起别名,最好使用typedef,而不是使用#define
网友评论