【C语言】typedef

一、C语言允许对已有的数据类型定义另外的类型名,目的是为了增强程序的可读性。重命名数据类型的命令是typedef,他一C语言形式出现在程序中。

typedef的一般形式如下:

typedef 已有类型名 新类型名;

例如:

typedef int intWith;
typedef float floatWith;

二、示例讲解

1. Typedef作用简介

#include 
#include 

// 与宏变量区别
typedef int Integer;
typedef unsigned int UInterger;
typedef float Float;

// 可以在别名的基础上在定义一个别名
typedef Integer MyInteger;    // 最终源头是int 类型

int main (int argc, const char * argv[]) {
	// 平时定义一个变量
	int a = 100;

	// typedef float Float;  不过这样子的话只能在函数内部使用
	// 使用typedef定义,
	Integer b = 100;     // 等价于int b = 100;
	UInterger c = 100;
	Float d = 21;
	MyInteger e = 100;

	// 输出
	printf("%d %d %.2f %d\n", b, c, d, e);
		
	system("pause");
	return 0;
}
2. typedef与指针

    typedef不仅能给基本数据类型定义别名,也可以给指针定义别名

// 与指针去别名
void testp() {
	typedef char *String; 
	// 相当于 char *str = "this is a string";
	String str = "this is a string";
	printf("%s", str);
}
3. typedef与结构体

    结构体中使用指针会更加简洁

    3.1 平时使用结构体变量

// 给结构体取别名
// 普通情况下
// 定义一个结构体
struct MyStruct01
{
	float a;
	float b;
};
// 调用
void testOfStruct() {
	// 定义结构体变量
	struct MyStruct01 p;  //每次定义结构体变量都是需要 struct 这个关键字

	p.a = 12.0f;
	p.b = 22.0f;

	printf("%f %f\n", p.a, p.b);
}
    3.2  使用typedef结构体给命名
// 使用typedef结构体给命名
struct MyStruct02
{
	float a;
	float b;
} xi;
// 取别名
typedef struct MyStruct02 pp;     // 可以合成一句:定义一个结构体,顺便起别名;或者是省略结构体名称
typedef xi ppp;                   // 更加简洁

// 调用
void testOfStruct() {
	// 定义结构体变量
    MyStruct02 pp;
	pp.a = 12.0f;
	pp.b = 22.0f;

	printf("%f %f\n", pp.a, pp.b);
}
4. typedef与指向 结构体指针  
// typedef与指向结构体的指针
// 定义一个结构体并取别名
typedef struct {
	float a;
	float b;
} MyStruct03;

//取别名
typedef MyStruct03 *pp;

// 调用
void testOfStruct03() {
	// 定义结构体变量
	MyStruct03 ppp = {10, 20};

	// 定义
	pp p = &ppp;

	// 利用指针变量访问结构体成员
    printf("x = %f, y = %f", p->a, p->b);
}
5. typedef与枚举类型
// 枚举
// 定义枚举类型
enum Season {   // 注意这里使用的是逗号, 而结构体使用的是分号;
	Spring,
	summer,
	winter
};
// 给枚举类型起别名
typedef enum Season Sea;
// 调用
void testOfEnum() {
	// 定义枚举变量
	Sea s = Spring;    // 这里就不在用带上关键字enum了
}
6.  typedef与指向函数的指针

    首先来区分下指针函数与指向函数的指针的区别

    1. 指针函数: 函数返回值是指针类型的函数称作指针函数。一般格式:

数据类型 * 函数名 (形参表)
{
	函数体
}
注意:对于指针函数,用return返回的值一定是指针值。

    2. 指向函数的指针变量:存放函数的入口地址的变量就是一个指向函数的指针变量,简称函数的指针。 

    函数的指针的定义形式是:

    数据类型 (* 指针变量名)()

    数据类型为函数返回值的类型。如:int (*p) (); 语句的功能是定义一个指向函数的指针,该函数的返回值为整型数据。

    和变量的指针一样,函数的指针也必须赋值后才能指向具体的函数。由于指针名代表了该函数的入口地址,因此,通常直接用函数名为函数指针赋值。

    函数指针名 = 函数名。例如:

double fun ();   // 函数说明
double (*f) ();   // 函数指针说明
f  = fun;         // f指向fun函数
6.1 函数指针例子
// 函数指针
// 定义一个sum函数,计算a跟b的和
int sum(int a, int b) {
	int c = a + b;
	printf("%d +%d = %d\n", a, b, c);
	return c;

}
// 调用
void testOfP() {
	// 定义一个指向sum函数的指针变量p
	int (*p)(int , int) = sum;
	// 利用指针变量p调用sum函数
	(*p)(4, 5);
	
}
6.2 为了简化代码我们使用typedef来给指向函数的指针类型起别名
// typedef来给函数指针起别名
int sum1(int a, int b) {
	int c = a + b;
	printf("%d +%d = %d\n", a, b, c);
	return c;

}
typedef int(*Mysum)(int, int);

// 调用
void testOfP1() {
	// 定义一个指向sum函数的指针变量p
	Mysum p = sum1;
	// 利用指针变量p调用sum函数
	(*p)(4, 5);

}
7. typedef与#define

注意宏定义纯粹是字符串的替换

例子1:

// #define与typedef的区别
typedef char *str;    // 用typedef给char *定义别名为String
#define  st char *;   // 用char *代替代码中的宏名String

void testOfDef() {
	str s = "thit is a string";
	printf("%s\n", s);

	st ss = "thit is a string";
	printf("%s\n", ss);
}

// 不过上面两个输出的结果是一样的 this is a string
例子2:
typedef char *String1;
#define String2 char *

void testOfDef1() {
	String1 str1, str2;
	// str1, str2 都是指向char类型的指针变量
	// 由于经过typedef处理后,String1也算是一种数据类型,所以String1 str1, str2;相当于
	// String1 str1;
	// String1 str2;
	// 由于String1就是char *,所以上面的两行代码等于
	// char *str1;
	// char *str2;

	String2 str3, str4;
	// char3 是指向char类型的指针变量, str4只是个char类型的变量
	// 因为宏定义纯粹是字符串替换,用char *代替String2,所以String2 str3, str4相当于
	// char *str3, str4;
	// 也就是 char *str3;
	// char str4;


	// 综上所述给类型取别名,多的话最好使用typedef,而不是使用#define
}


你可能感兴趣的:(C)