C语言(八)typedef关键字

一、typedef作用简介

我们可以使用typedef关键字为各种数据类型定义一个新名字(别名)。


#include <stdio.h>

 

typedef int Integer;    //为int数据类型定义一个别名

typedef unsigned int UInterger;

typedef float Float;

 

int main(){

	Integer i=-10;

	UInterger ui =11;

	Float f=12.39f;

	printf("%d %d %.2f",i,ui,f);

	

	return 0;	

}

为数据类型起了别名后,原来的名字还是可以用的。

也可以在别名的基础上再起一个别名。


#include <stdio.h>

 

typedef int Integer;

typedef Integer MyInteger;

 

int main(){

	MyInteger i=-10;

	printf("%d ",i);

	

	return 0;	

}

二、typedef与指针


#include <stdio.h>

 

typedef char* MyString;

int main(int argc,const char * argv[]){

	MyString str="this is a string";

	printf("%s",str);

	return 0;	

}

三、typedef与结构体

给结构体起别名可以使代码更加简明

1.默认情况下结构体变量的使用


// 定义一个结构体

struct MyPoint {

    float x;

    float y;

};

 

int main(int argc, const char * argv[]) {

    // 定义结构体变量

    struct MyPoint p;

    p.x = 10.0f;

    p.y = 20.0f;

    

    return 0;

}

2.给结构体定义别名


// 定义一个结构体

struct MyPoint {

    float x;

    float y;

};

 

// 起别名

typedef struct MyPoint Point;

 

int main(int argc, const char * argv[]) {

    // 定义结构体变量

    Point p;

    p.x = 10.0f;

    p.y = 20.0f;

    

    return 0;

}

在第8行,给结构体MyPoint起了别名,在12行用Point定义了一个结构体变量,不用再带上struct关键字了。

其实可以简写:


// 定义一个结构体,顺便起别名

typedef struct MyPoint {

    float x;

    float y;

} Point;

甚至可以省略结构体名称


typedef struct {

    float x;

    float y;

} Point;

四、typedef与指向结构体的指针


#include <stdio.h>

//定义一个结构体,并给结构体起别名

typedef struct{

	float x;

	float y;	

} Point;

 

//定义一个指向结构体类型(别名的方式)的指针,并为指针取别名

typedef Point *pp;

 

int main(){

	//定义结构体变量--用别名

	Point point ={10,20};

	//定义指针变量

	pp p=&point;

	//用指针变量访问结构体成员

	printf("x=%f,y=%f\n",p->x,p->y);

	return 0;	

}

在上面的例子中,以省略结构体名称的方式定义了一个结构体,同时为结构体起了别名。

定义一个指向结构体类型的指针,这里的结构体类型用别别名的方式,并同时为指针取了别名。

五、typedef与枚举类型


//定义了一个枚举类型

enum Season {spring,summer,autumn,winter};

//给枚举变量取别名

typedef enum Season Sea;

 

int main(){

	//定义枚举变量,起了别名之后,都不用带上enum关键字了。

	Sea s=spring;

	return 0;	

}

也可以i在定义枚举类型的同时起别名

typedef enum Season{spring,summer,autumn,winter} Sea;

typedef enum {spring,summer,autumn,winter} Sea

六、typedef与指向函数的指针

不是用别名


#include <stdio.h>

 

int sum(int a,int b){

	int c=a+b;

	printf("%d + %d=%d\n",a,b,c);

	return c;	

}

int main(){

	//定义一个指向函数的指针

	int (*p)(int ,int)=sum;	

	

	int result=(*p)(4,5);

	printf("%d\n",result);

	return 0;

}

使用别名


#include <stdio.h>

 

int sum(int a,int b){

	int c=a+b;

	printf("%d + %d=%d\n",a,b,c);

	return c;	

}

//声明一个指针并取别名

typedef int (*MySum)(int,int);

int main(){

	//定义一个指向函数sum的指针变量

	MySum p=sum;

	int result=(*p)(4,5);

	printf("%d\n",result);

	return 0;

}

七、typedef与#define

1.比较2段代码

代码1:


typedef char *String;

 

int main(int argc, const char * argv[]) {

    String str = "This is a string!";

    return 0;

}

代码2:


#define String char *

 

int main(int argc, const char * argv[]) {

    String str = "This is a string!";

    return 0;

}

上面的2段代码只是第一行代码不一样,运行的效果都是一样的。但是实现的方式是不一样的:

代码1:用的是typedef给char *定义别名String

代码2:用的是char *代替代码中的宏名String

2.看代码


typedef char *String1;

 

#define String2 char *

 

int main(int argc, const char * argv[]) {

    String1 str1, str2;

    

    String2 str3, str4;

    return 0;

}

上面的代码中,只有str1,str2,str3才是指向char的类型的指针变量,str4只是一个char类型的变量。

原因分析:

经过typedef处理后,String1也相当于一种数据类型,所以String1 str1,str2;相当于String1 str1;String1 str2。

#define String2 char *;

String2 str3,str4;

因为宏定义是纯粹的字符串替换,用char 8替换String2,也就相当于char *str3,str4,也就相当于char *str3,char str4;

所以,给类型起别名的时,最好使用typedef。

总结:

typedef只是纯粹为原本的数据类型取一个别名而已,就相当于人的外号,多了一个更加方便的称呼而已。

时间: 2024-11-10 07:14:56

C语言(八)typedef关键字的相关文章

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 关键字,以及作用域

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

初探C/C++ typedef关键字

提问 我知道typedef是类型别名的意思,也知道结构体如何定义. 但下面的代码: typedef struct node{ struct node*lchild; char data; struct node*rchild; }bitnode,*bitree; 那这样结构体后面的是对象还是别名呢?我感觉应该是对象,但typedef又无从说起. 然后接着有 bitree createtree(){ -- } 很明显bitree是一种类型,但他又是一个指针,我能说他就是指向这个结构体的对象的指针么

C++那些细节--typedef关键字

一.简介 关于typedef关键字,以前刚刚学C语言的时候,用它来重定义结构体别名.之后的话就是在用函数指针的时候用过一些,然而并不知道这个还有什么用处.今天花点时间总结一下typedef的细节. 在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异.简单来说,就是用来给一个复杂变量定义一个好记一点的名字.另外,使用typedef可以简化一些复杂的声明. 二.typedef的用途 1.定义类型别名,而不是简单的替换 typedef的第一个功能是定义类型的别名,比如Int*,比较麻烦

C语言32个关键字总结

C语言32个关键字  第一类:数据类型关键字 A基本数据类型(5个) void 声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果. char 字符型类型数据,属于整型数据的一种.int 整型数据,通常为编译器指定的机器字长.float 单精度浮点型数据,属于浮点数据的一种,小数点后保存6位.double 双精度浮点型数据,属于浮点数据的一种,比float保存的精度高,小数点后保存15/16位. B类型修饰关键字(4个) short 修饰int,短整型数据,可省略被修饰的int. lon

C语言的那些关键字

C语言有一堆关键字,一共n个,就在下面: 1.类型关键字 系统内置类型:long short int char float double void long:32位整数,默认为有符号,下同 short:16位整数 int:根据机器而定是32位还是16位整数,现在的一般都是32(常用) char:8位字符(常用) float:32位小数(单精度) double:64位小数(双精度)(常用) void:无(变量只能用于void*,函数返回类型可以用void)(常用) 自定义类型:struct uni

C语言中的关键字

1.C语言中的关键字都有实际的意义. 2.C语言中的23个关键字如下: char:声明字符型变量. short:声明短整型变量. int:声明整型变量. long:声明长整型变量. float:声明浮点型变量. double:声明双精度型变量. struct:声明结构体变量. union:声明共用体变量. enum:申明枚举类型. typedef:用来该数据类型取别名. const:声明只读变量. unsigned:声明无符号类型变量. signed:声明有符号类型变量. extern:声明变量

C语言知识二——关键字

关键字是编译器预先定义好的有一定意义的字符串,c语言有32个关键字.C语言的关键字分为:(1)数据类型关键字:(2)逻辑结构关键字:(3)类型修饰符关键字:(4)自定义类型关键字:(5)杂项 一:数据类型关键字 从c语言角度理解计算机由三个组件组成1.cpu:2.资源:3.连接cpu和资源的数据总线和地址总线.c语言操作的对象是资源也就是内存(包含LCD缓存......),那么在c语言中就需要对这些资源的属性进行描述,资源的属性很多,其中一个属性为资源的大小,在c语言中数据类型关键字可以描述资源

【转载】理解C语言中的关键字extern

原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻译了一下.(原文:http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/)   我确定这篇文章对c语言的初学者会有很大的帮助,因为这将使他们更好更熟练的使用c语言.所以就让我先来说说extern关键字在变量和函数上的应用.最基本