当前位置:首页 » 编程语言 » c语言typedef用法

c语言typedef用法

发布时间: 2023-05-19 05:31:43

A. 在c语言中typedef是什么意思干什么用的

typedef是C/C++常用语法,typedef作用,归结起来,可以分为四种:

1、定义一种类型名

常规的应用中,想要定义两个字符指针,写下如下代码: char *a, b

(1)char* a,b;

(2)char c='m';

(3)a=&c;

(4)b=&c;

上述代码是错误的,只有a为字符指针,b仍旧为字符变量。通过#define进行宏定义,仍然是无效的,因为宏定义仅仅是字符替换。

以下则可行:

(1)typedef char* PCHAR;

(2)PCHAR pa, pb;

2、用于struct结构体

(1)#include <stdio.h>

(2)struct tagPOINT1

(3){

(4)int x;

(5)int y;

(6)};

(7)int main()

(8){

(9)tagPOINT1 p1,p2;//此句编译无法通过

(10)//错误信息:error: unknown type name 'tagPOINT1'

(11) //环境:Gcc 4.8.1

(12)}

必须采用如下定义;

(1)struct tagPOINT1 p1,p2;//必须有关键字 struct

(2)采用typedef,则可以省掉结构体定义时的struct

(3)ypedef struct tagPOINT

(4){

(5)int x;

(6)int y;

(7)}POINT;

(8)POINT p1; // 这样就比原来的方式少写了一个struct。

3、跨平台移植

程序编写中,如果考虑到平台移植的因素,则需要从代码中抽象出硬件层的差异,例如,变量所占空间,端模式等等。

考虑一个浮点型变量,在不同的硬件平台上,所占据的空间有可能不同,此时,可以采用typedef将其定义到单独的头文件内,该头文件是纯粹抽象硬件相关的内容:

(1)typedef float REAL;

(2)typedef short int INT16;

(3)typedef int INT32

(4)...

这样的话,如果将来考虑到程序的移植,只需要修改该头文件即可。

4、为复杂的声明取别名

复杂的声明形如:void (*b[10]) (void (*)());

意思:首先*b[10]为指针数组,它里面的十个元素全是指针。到底是什么指针呢,是一个返回类型为空,形参为空的函数指针。

这种复杂的声明,可以用typedef进行简化:

首先:声明后面的函数指针:

(1)typedef void (pFunParam *)();

接着声明前面的指针数组:

(1)typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];

本文档在撰写过程中,参考了网络博客typedef用法

里面提到一个复杂的声明:

(1)doube(*)() (*e)[9];

而然这个声明在肆顷gcc下编译时不通过的,按销森照作者的本意,似乎应该这样声明:

(1)double (*(*e)[9])();

e是一个指向9维数组的指针,数组内为函数指针,该函数指针形参为空,返回类型为double。

这样的话,应该采用这样的typedef来简化声明:

typedef (*(*ptr)[9])();

(1)c语言typedef用法扩展阅读

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

编程中使用typedef目的一般有两个,一个是给裂斗陆变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

B. typedef在c语言的用法

C语言允许毁并为一个数据类型起一个新的别名,就像给人起“绰号”一样。

起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:struct stu stu1;
struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了:STU stu1;
这种写法更加简练,意义也非常明确,不管是槐春在标准头文件中还是以后的编程实践中,都会大量使用这种别名。

使用关键字 typedef 可以为类型起一个新的别名。typedef 的用法一般为:typedef  oldName  newName;
oldName 是类型原来的名字,newName 是类型新的名字。例如:typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;
INTEGER a, b;等效于int a, b;。

typedef 还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子:
typedef char ARRAY20[20];
表示 ARRAY20 是类型char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:ARRAY20 a1, a2, s1, s2;
它等价于:char a1[20], a2[20], s1[20], s2[20];
注意,数组也是有类型的。例如char a1[20];定义了一个数组 a1,它的类型就是 char [20],这一点已在VIP教程《数组和指针绝不等价,数组是另外一种类型》中讲解过。

又如,为结构体类型定义别名:
typedef struct stu{
char name[20];
int age;
char sex;
} STU;
STU 是 struct stu 的别名,可以用 STU 定义结构体变量:STU body1,body2;
它等价于:struct stu body1, body2;

再如,为指针类型定义别名:typedef int (*PTR_TO_ARR)[4];
表示 PTR_TO_ARR 是类型int * [4]的别名,它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针:PTR_TO_ARR p1, p2;
按照类纤明迹似的写法,还可以为函数指针类型定义别名:typedef int (*PTR_TO_FUNC)(int, int);
PTR_TO_FUNC pfunc;
【示例】为指针定义别名。#include <stdio.h>
typedef char (*PTR_TO_ARR)[30];
typedef int (*PTR_TO_FUNC)(int, int);
int max(int a, int b){
return a>b ? a : b;
}
char str[3][30] = {
"http://c.biancheng.net",
"C语言中文网",
"C-Language"
};
int main(){
PTR_TO_ARR parr = str;
PTR_TO_FUNC pfunc = max;
int i;

printf("max: %d\n", (*pfunc)(10, 20));
for(i=0; i<3; i++){
printf("str[%d]: %s\n", i, *(parr+i));
}
return 0;
}
运行结果:
max: 20
str[0]: http://c.biancheng.net
str[1]: C语言中文网
str[2]: C-Language

需要强调的是,typedef 是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。typedef 和 #define 的区别
typedef 在表现上有时候类似于 #define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把 typedef 看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。

1) 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做。如下所示:#define INTERGE int
unsigned INTERGE n;  //没问题

typedef int INTERGE;
unsigned INTERGE n;  //错误,不能在 INTERGE 前面添加 unsigned

2) 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define

C. c语言关于typedef的用法。

这是定义函数指针,因为windows事件机制需烂姿要向操作系统注册回调函数,操作系统通过回调函数引发应用程序事件。回调函数就饥物绝是通过函数指针实现的。函数指针的用法,如:蚂卖
#include
#include
//定义函数指针
typedef
int
(*pfx)(int,
int);
int
fx(int
a,
int
b)
{
return
a
*
b;
}
int
fy(int
a,
int
b)
{
return
a
+
b;
}
int
main()
{
pfx
pa;
pa
=
fx;
printf("%d\n",
pa(3,
4));
//pa(3,
4)
调用的是:fx(3,
4)
pa
=
fy;
printf("%d\n",
pa(3,
4));
//pa(3,
4)
调用的是:fy(3,
4)
system("pause");
//避免窗口一闪而退
return
0;
}

热点内容
云服务器的ip固定的吗 发布:2025-07-15 19:26:12 浏览:934
怎么建立电脑配置文件 发布:2025-07-15 19:23:57 浏览:672
手机导航源码下载 发布:2025-07-15 19:18:29 浏览:499
什么是原生态安卓机 发布:2025-07-15 19:16:52 浏览:686
linux的安装目录在哪 发布:2025-07-15 19:10:04 浏览:724
2008编程入门经典 发布:2025-07-15 18:58:44 浏览:603
艾派密码是什么 发布:2025-07-15 18:47:40 浏览:588
密码锁如何在里面开门 发布:2025-07-15 18:35:00 浏览:521
额温算法 发布:2025-07-15 18:18:14 浏览:728
ie客户端事件脚本执行异常 发布:2025-07-15 18:10:13 浏览:26