复习|typedef什么意思,用法,作用-程序员宅基地

技术标签: c++  c语言  编程语言  typedef  指针  

typedef是在计算机编程语言中用来为复杂的声明定义简单的别名

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

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

用GNU的gcc和g++编译器,是会出现警告的,按照顺序,“const pstr”被解释为“char* const”(一个指向char的指针常量),而事实上,const char*和char* const表达的并非同一意思,const char*的意思是创建一个指向char类型的指针且不能更改指向地址上的值,而char* const则是不能更改指向的地址

char* const p : 定义一个指向字符的指针常数,即const指针,常量指针。

const char* p :定义一个指向字符型常量的指针。

作用

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结构体

#include <stdio.h>

struct tagPOINT1

{

int x;

int y;

};

int main()

{

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

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

//环境:Gcc 4.8.1

}

必须采用如下定义;

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

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

typedef struct tagPOINT

{

int x;

int y;

}POINT;

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])();

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38384897/article/details/115866973

智能推荐

SSH远程登录、.sh文件后缀运行、l l命令结果说明、VIM模式切换_sh命令的l-程序员宅基地

文章浏览阅读877次。SSH远程登录、.sh文件后缀运行、l l命令结果说明、VIM模式切换文章目录SSH远程登录、.sh文件后缀运行、l l命令结果说明、VIM模式切换SSH远程安全登录.sh文件后缀运行l l命令结果说明VIM模式切换SSH远程安全登录SSH为网络协议,专门为远程登录会话和其他网络服务提供安全性的协议,用于在计算机之间的加密登录,对数据进行加密。SSH主要用于远程登录,主要有口令登录..._sh命令的l

Java 使用POST方式调用XML接口并使用dom4j解析返回的xml报文中的CDATA数据_java接收xml格式报文-程序员宅基地

文章浏览阅读2.7k次。Java 使用POST方式调用XML接口并使用dom4j解析返回的xml报文中的CDATA数据。_java接收xml格式报文

linux下的外接显示器设置成竖屏_linux显示器竖屏怎么调整-程序员宅基地

文章浏览阅读1.9k次。linux下的外接显示器设置成竖屏用到的软件系统设置里的Displayxrandr用到的命令$: xrandr -o left\right步骤1.在Display里选择设置的显示器为主显2.用上边的xrandr的命令,把屏幕左或右转3.surprised!这就ok了ps:折腾到最后发现的这个让人怀疑人生的简单方法..._linux显示器竖屏怎么调整

mysql行级锁 表级锁 乐观锁 悲观锁_行级锁 乐观锁-程序员宅基地

文章浏览阅读310次。*在MySQL中,只要有多个请求需要在同一时刻修改数据,都会产生并发控制的问题。而锁的作用可以保证同一资源能被某个请求唯一使用。加锁是会消耗系统资源的,包括获得锁、检查锁是否已解除、释放锁等等操作,都会增加系统的开销.为了平衡锁的开销和数据的安全性,MySQL对锁的粒度提供了多种方式,主要分为表锁和行级锁。1.row-level locking(行级锁)行锁,由字面意思理解,就是给某一行加上锁,也就是一条记录加上锁。只有线程当前使用的行被锁定,其他行对于其他线程都是可用的InnoDB默认行级锁。是基_行级锁 乐观锁

黑马瑞吉外卖之后台登录与退出功能开发_瑞吉外卖移动端退出功能-程序员宅基地

文章浏览阅读1k次。这个项目是基于springboot+mybatisplus作为核心的开发项目。是一款外卖开发项目。本次还是从后台管理界面进行开发的,前些天敲完了基本,后来还是给自己遗留了一个bug,项目还有没有完善的部分,现在就从写博客这里重新捋一遍。这样也许更有效果。很多人觉得简单,但是我觉得这是一个非常重要的项目,是一次真正意义上的前后堵的人项目。很值得我们去多家回顾练习。本篇从后台的一个登录界面开始。这里前端页面已经给好了,但是我们后端还是需要去看懂。这是我们需要的数据表。用户登录啊需要这个表,employss,默_瑞吉外卖移动端退出功能

力扣练习第三十六天——最小栈_力扣 最小栈 js-程序员宅基地

文章浏览阅读98次。力扣练习第三十六天——最小栈题目大致如下:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);..._力扣 最小栈 js

随便推点

MySQL全部详细步骤(官网下载、安装、环境变量配置、卸载、解决端口占用)--2023.8_mysql官网下载步骤-程序员宅基地

文章浏览阅读1.1w次,点赞43次,收藏200次。1.浏览器搜索mysql,然后点击进去点击选择的方式安装,但是觉得压缩包下载使用更方便选择安装到电脑上点击这个这里选择版本号1.下载打开后就是这个界面,对应选项分别是开发者版、服务器版、客户端版、只安装安装包自带的所有插件版、自定义版。我们这里选择服务版安装就好,点击下一步Next下一步点击高级选项在要放MySQL的文件夹里面或者其他地方新建一个文件夹,命名为Data,以后MySQL的文件缓存数据都会放在这里,方便统一管理。_mysql官网下载步骤

2021SC@SDUSC-multimedia-utils-一款java后端的图片、视频处理工具jar包_java图像处理的jar包-程序员宅基地

文章浏览阅读321次。2021SC@SDUSC目录项目名称:multimedia-utilsREADME.md添加工具方法Suffix.javaREADME.md添加工具方法VideoSize.java项目名称:multimedia-utils博客八在前两篇博客中我们介绍了java对音视频以及图片的转码和处理部分。在接下来我们会介绍README.md添加工具方法文档。README.md添加工具方法Suffix.java这段代码的主要作用是压缩参数时改为在运行压缩时设置,这样方.._java图像处理的jar包

【Word】双栏论文尾页文字齐平排版的实现_文章最终的结尾处两栏的文字齐平排版-程序员宅基地

文章浏览阅读1.4w次,点赞19次,收藏34次。*以下方法以MS Office 2019 Word为平台实现为方便阅读或节省空间,许多论文采用双栏排版方式,同时要求最后一页左右栏文字的下端要平齐,如图(从《<机械工程学报>论文投稿模板》截得)。默认情况下,左栏文字写满后才会将新文字排到右栏,因此最后一页通常左右两栏底部不齐平的,如下图。解决办法很简单,直接在文章最后一个字的后面插入连续型分节符即可,如下图。效果如下:..._文章最终的结尾处两栏的文字齐平排版

[XSCTF]easyxor-程序员宅基地

文章浏览阅读245次。在这个循环里,将异或得到的结果每次减去1,同时在数组里写上1,往后遍历数组。查看,main函数,首先是将输入的数据与key中的字符依次异或。直到异或得到的结果减为0,在数组中写一个0进行标记。最后比较数组是否与r数组相同。_easyxor

NVIDIA DALI从入门到放弃之一:概述_nvidia dail-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏19次。NVIDIA DALI从入门到放弃之一:概述NVIDIA DALI从入门到放弃之二:入门示例NVIDIA DALI从入门到放弃之三:Data LoadingNVIDIA DALI从入门到放弃之四:Multiple GPUNVIDIA DALI从入门到放弃之五:Image ProcessingNVIDIA DALI从入门到放弃之六:Geometric TransformsNVIDIA DALI从入门到放弃之七:Sequence ProcessingNVIDIA DALI从入门到放弃之八:PyTo_nvidia dail

推荐文章

热门文章

相关标签