美文网首页C&C++程序员
c语言中的关键字typedef(别名)的用法

c语言中的关键字typedef(别名)的用法

作者: 一只小蝉儿 | 来源:发表于2016-05-19 13:52 被阅读1525次

在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

相关文章

  • c语言中的关键字typedef(别名)的用法

    在iOS开发中,常常用typedef来为复杂的声明定义简单的别名,一致没有系统的总结过,今天就小小的总结学习下。不...

  • typedef和typename

    一、typedef 用法:typedef 内置类型 别名 关键字typedef对内置类型、类类型等进行重命名,使用...

  • C++ 类型声明

    类型别名 typedef关键字 typedef关键字是继承自C语言的特性,利用它我们可以为一个类型起别名,一般用于...

  • typedef使用

    typedef作为C的关键字,有着类似起别名的作用,不过它是给数据类型起别名,比如int、string、char、...

  • Go Type

    Go语言中type关键字用于定义类型,因此又称为类型别名。 Go语言中的type并不对应着C/C++语言中的typ...

  • C/C++关键字介绍

    一、 typedef typedef为C/C++的关键字,与auto、extern、mutable、static、...

  • C++ struct

    1、typedef C语言中,使用如下格式 Typedef struct A { Int a; }A_type; ...

  • C typedef 的用法

    引言 C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。 用法: 在实际应用中,主要有4...

  • typedef的用法

    一、typedef的用法 ①:定义一种类型的别名,但不是简单的宏替换。 通常来说,typedef要比#define...

  • C++<第十二篇>:typedef用法

    typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,...

网友评论

  • Mr_Lucifer:2、使用typedef给结构体起别名 typedef struct MyPoint Point; SPoint 这写错了吧?
    一只小蝉儿:@Mr_Lucifer 是的,马上改 :grin: 谢谢哈!

本文标题:c语言中的关键字typedef(别名)的用法

本文链接:https://www.haomeiwen.com/subject/npkgrttx.html