【C语言|关键字】C语言32个关键字详解(4)——其他(typedef、sizeof)
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍标准C语言的32个关键字🍭
😎金句分享😎:🍭有机会一定要试试,其实试错的成本并不高,而错过的成本很高🍭
C语言32个关键字详解(1):数据类型部分(char、short、int、long、float、double、struct、union、enum、void)
C语言32个关键字详解(2):修饰类型部分(auto、signed、unsigned、static、extern、const、register、volatile)
C语言32个关键字详解(3):结构语句部分(if、else、switch、case、default、do、while、for、break、continue、return、goto)
C语言32个关键字详解(4):其他(typedef、sizeof)
目录
- 🎄一、概述
- 🎄二、typedef 关键字
- ✨2.1 typedef 给类型取别名
- ✨2.2 typedef 的类型 和 const 一起使用
- ✨2.3 typedef 的类型 和 #define 的区别
- 🎄三、sizeof 关键字
- ✨3.1 sizeof 是关键字,不是函数
- ✨3.2 sizeof 与指针、数组的使用
- 🎄四、总结
🎄一、概述
C语言的关键字有32个,我将它主要分成下面四个方面来介绍。
功能 | 关键字 |
---|---|
类型(10个) | char、short、int、long、float、double、struct、union、enum、void |
修饰类型(8个) | auto、signed、unsigned、static、extern、const、register、volatile |
结构语句(12个) | if、else、switch、case、default、do、while、for、break、continue、return、goto |
其他(2个) | typedef、sizeof |
前面介绍了char、short、int、long、float、double、struct、union、enum、void、auto、signed、unsigned、static、extern、const、register、volatile、 if、else、switch、case、default、do、while、for、break、continue、return、goto
;
这篇文章主要介绍最后两个关键字typedef、sizeo
。
🎄二、typedef 关键字
✨2.1 typedef 给类型取别名
从 typedef
的名字来看,会以为它是定义新的数据类型,但实际上 typedef
的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。常用来给基本类型、指针类型、函数指针取别名;
常见的用法:
1、给基本数据类型重命名,代码如下:
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;uint64_t u64_i = 0; // 等同于 unsigned long long u64_i = 0;
2、给结构体、结构体指针类型取别名:
typedef struct student
{
//...code
}Stu_st, *Stu_pst;Stu_st stu; // 等同于 struct student stu;
Stu_pst pStu; // 等同于 struct student* pStu;
3、给函数指针类型取别名:
typedef unsigned int (*fn_callback)(void*,void*);
fn_callback fn_callback; // 定义一个函数指针 fn_callback
✨2.2 typedef 的类型 和 const 一起使用
首先,我们知道
const
在类型前或后去修饰一个变量时,效果是一样的。
如:const int i;
和int const i;
两个语句都是表示变量i
的值是只读的,不允许被改变。
而
const
在*
前面表示修饰的指针指向的对象是只读的,const
在*
后面表示指针是只读的,如:
const int * pI;
表示pI
指向的对象的值是只读的,不能被改变;
int * const pI;
表示pI
变量的值是只读的,不能被改变;
那么下面的代码中,先将int *
重命名为 pInt
。请问 const_pInt
和 pInt_const
分别表示哪些是只读的?
typedef int * pInt;
const pInt const_pInt;
pInt const pInt_const;
可能你会认为const_pInt
表示指针指向的对象是只读的,而pInt_const
表示指针本身是只读的。答案是,const_pInt
和 pInt_const
都是表示指针本身是只读的。因为编译器单纯地把pInt
当作一个类型来处理,所以它只会限制变量只读,不可修改。
可以用下面代码测试验证:
// typedef.c
#include <stdio.h>
typedef int * pInt;
int main()
{int i=0, j=0;const pInt const_pInt = &i;pInt const pInt_const = &i;//const_pInt = &j; //报错:assignment of read-only variable ‘const_pInt’//pInt_const = &j; //报错:assignment of read-only variable ‘pInt_const’*const_pInt = 1;*pInt_const = 2;return 0;
}
原文链接:https://blog.csdn.net/wkd_007/article/details/133997095
✨2.3 typedef 的类型 和 #define 的区别
如果将上面的typedef int * pInt;
替换成#define pInt int*
,const_pInt
和 pInt_const
分别表示哪些是只读的?
答案是,const_pInt
表示指针指向的对象是只读的,而pInt_const
表示指针本身是只读的。因为宏定义会在预处理阶段替换成int*
,就变成了const int * const_pInt;
和int * const pInt_const;
可以用下面的代码测试验证:
//typdef_define.c
#include <stdio.h>
#define pInt int*
int main()
{int i=0, j=0;const pInt const_pInt = &i;pInt const pInt_const = &i;const_pInt = &j;//pInt_const = &j; //报错:assignment of read-only variable ‘pInt_const’//*const_pInt = 1; //报错:assignment of read-only location ‘*const_pInt’*pInt_const = 2;return 0;
}
因为宏定义只是进行简单的字符串替换,所以宏定义的指针类型,每次只能成功定义一个指针变量。
例如:下面代码中,pI
变量是int*
类型的,而i
变量则是int
类型的;
而pS
、pSh
都是short *
类型的。
#define pInt int*
typedef short * pShort;
pInt pI,i;
pShort pS,pSh;
🎄三、sizeof 关键字
✨3.1 sizeof 是关键字,不是函数
sizeof 关键字常被误以为是函数,实际上,它是一个关键字。作用是在编译时计算给定类型或变量的大小,并返回占用空间大小,返回的值是long unsigned int
类型的。
在计算指定类型大小时,需要加()
,计算指定变量的大小时可以不用()
,下面代码中,sizeof(int), sizeof(i), sizeof i
都是正确的,如果写成sizeof int
就是错误的,因为返回的值是long unsigned int
,用%lu
打印。
#include <stdio.h>
int main()
{int i = 0;printf("sizeof(int)=%lu, sizeof(i)=%lu sizeof i = %lu\n",sizeof(int), sizeof(i), sizeof i);return 0;
}
注意:
1、sizeof i
这个语句是正确的,就可以证明 sizeof
是关键字而不是函数,因为不能这样调用;
2、一般情况下,使用sizeof
时,建议带上()
;
✨3.2 sizeof 与指针、数组的使用
sizeof 关键字计算指针的值时,在32位系统永远返回4,在64位系统永远返回8;
int *p = NULL;
sizeof(p)的值是多少?
sizeof(*p)呢?int a[100];
sizeof (a) 的值是多少?
sizeof(a[100])呢? //请尤其注意本例。
sizeof(&a)呢?
sizeof(&a[0])呢?
sizeof((&a)[0])呢?int b[100];
void fun(int b[100])
{sizeof(b);// sizeof (b) 的值是多少?
}
阅读上面代码,试着判断各个sizeof
的值是多少?答案在下文给出,可以自己先判断,看看能否准确!!!
在判断sizeof
的值时,要清楚指定的变量是什么类型?
以32位系统为例,只要是指针,其sizeof
的值就是4;
只要是数组名,sizeof
大小就是整个数组的大小;
只要是数组元素,sizeof
大小就是单个数元素的大小;
如果数组作用函数参数,那么sizeof(数组名)
的大小则等于指针的大小;
答案:在64位系统运行下面代码,打印的答案如下:
sizeof(p)=8 sizeof(*p)=4
sizeof(a)=400, sizeof(a[100])=4, sizeof(&a)=8, sizeof(&a[0])=8, sizeof((&a)[0])=400
sizeof(b)=8
// sizeof_arr.c
#include <stdio.h>void fun(int b[100])
{printf("sizeof(b)=%lu\n",sizeof(b));
}int main()
{int *p = NULL;printf("sizeof(p)=%lu sizeof(*p)=%lu\n",sizeof(p),sizeof(*p));int a[100];printf("sizeof(a)=%lu, sizeof(a[100])=%lu, sizeof(&a)=%lu, sizeof(&a[0])=%lu, sizeof((&a)[0])=%lu\n",sizeof(a), sizeof(a[100]), sizeof(&a), sizeof(&a[0]), sizeof((&a)[0]));int b[100];fun(b);return 0;
}
🎄四、总结
本文主要介绍C语言的两个关键字typedef、sizeof
,结合前面的30个,C语言的32个关键字全部介绍完了。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁
相关文章:

【C语言|关键字】C语言32个关键字详解(4)——其他(typedef、sizeof)
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

Hafnium简介和构建
安全之安全(security)博客目录导读 目录 一、Hafnium简介 二、Hafnium构建 2.1.1 先决条件 2.1.1.1 构建Host 2.1.1.2 工具链 2.1.1.3 依赖 2.1.1.4 获取源码 2.1.2 构建 一、Hafnium简介 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现。它为SoC开发人…...

2023年香水行业数据分析:国人用香需求升级,高端香水高速增长
在人口结构变迁的背景下,“Z世代”作为当下我国的消费主力,正在将“悦己”消费推动成为新潮流。具备经济基础的“Z世代”倡导“高颜值”、“个性化”、“精致主义”,这和香水、香氛为代表的“嗅觉经济”的特性充分契合,因此&#…...

这可能是最简单的Page Object库
做过web自动化测试的同学,对Page object设计模式应该不陌生。 Page object库应该根据以下目标开发: Page object应该易于使用 清晰的结构 PageObjects 对于页面对象 PageModules对于页面内容 只写测试,而不是基础。 在可能的情况下防止…...

论文阅读——BERT
ArXiv:https://arxiv.org/abs/1810.04805 github:GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT 一、模型及特点: 1、模型: 深层双向transformer encoder结构 BERT-BASE:(L12, H…...

竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…...

Springboot创建多数据源
yml文件 spring:datasource:dynamic:# 设置默认的数据源或者数据源组,默认值即为 masterprimary: masterdatasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?useUnicodetrue&characterEncodingutf8…...

【Hello Algorithm】滑动窗口内最大值最小值
滑动窗口介绍 滑动窗口是一种我们想象中的数据结构 它是用来解决算法问题的 我们可以想象出一个数组 然后再在这个数组的起始位置想象出两个指针 L 和 R 我们对于这两个指针做出以下规定 L 和 R指针只能往右移动L指针不能走到R指针的右边我们只能看到L指针和R指针中间的数字 …...

HTML,CSS实现鼠标划过头像,头像突出变大(附源码)
话不多说,先上代码 先看原图: 再看 鼠标放上去后的图: 是不是明显感觉到 人物头像突出了一些,而且还增加了阴影部分的效果呢? 直接上代码!!! <!--由于我的 img 标签放的是循环后…...

“爱知道”,你知道吗?
拥抱时代浪潮,加速科技变革。数字经济时代,杭州重点贯彻市委市政府数字经济创新提质“一号发展工程”,加快发展数字经济,推动全市数字经济往高攀升、向新进军、以融提效。基于政府对数字经济新活力的赋能、优化数字社会环节、构建…...

基于SpringBoot+Vue的服装销售系统
基于SpringBootVue的服装销售平台的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 我的订单 登录界面 管理员界面 摘要 基于SpringBoot和Vue的服装销售系统…...

针对多分类问题,使用深度学习--Keras进行微调提升性能
前面的文章对二分类问题用Keras进行了Fine-tune,使得模型的准确率进一步提升,此处对于多分类问题,尝试使用Fine-tune来提升性能。 1. 准备数据集 为了演示,本次选用了博文keras系列︱图像多分类训练与利用bottleneck features进行微调(三)中提到的数据集,原始的数据集…...

一、【Photoshop如何根据不同类型图像抠图】
文章目录 前言图形结构1、规则图形2、不规则图形 图形颜色1、轮廓清晰2、颜色分明 前言 当我们有抠图需求的时候,不要一开始就想着我怎么去把它抠出来,首先应该分析图形的特点,然后再去选取合适的工具,这样才可以做到事半功倍&am…...

rust - 理解borrow trait
简介 borrow trait 是处理借用(即其它语言中的引用)的 trait,变量的所有权不会转移.泛型定义如下: pub trait Borrow<Borrowed: ?Sized> {/// Immutably borrows from an owned value.fn borrow(&self) -> &Borrowed; }其中包含一个 borrow(&self)的方…...

review-java-basis
Path环境变量用于记住程序路径,方便在命令行窗口的任意目录启动程序 \n代表换行的意思,/t代表一个tab前进一格 强转可能导致数据的丢失(溢出) 浮点型转换为整型,直接丢掉小数部分,保留整数部分返回 数据类…...

Go 语言访问 Redis 笔记
文章目录 Mac 下载 RedisMac Redix 数据库打开服务端客户端 导包连接数据库操作字符串操作 Hash设置过期时间队列操作连接池并发操作管道化操作事务操作 Mac 下载 Redis Mac安装Redis,原来就是这么简单 Mac Redix 数据库打开 brew services start redis 服务端 …...

【MySQL数据库重点】第二节:MySQL基础知识(基本操作)
目录 一:数据库的操作 1.显示数据库 2.创建数据库 3.使用数据库 4.删除数据库 二:常用数据类型 1.数值类型:整型和浮点型 2.字符串类型 3.日期类型 三:表的操作 1.查看表结构 2.创建表 3.删除表 一:数据库…...

计算机网络--第一次作业
1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式,通信之前要在通信双方之间建立一条被双方独占的物理通道(由通信双方之间的交换设备和链路逐段连接而成)。 优点: ①由于通信线路为…...

网络协议--TCP的成块数据流
20.1 引言 在第15章我们看到TFTP使用了停止等待协议。数据发送方在发送下一个数据块之前需要等待接收对已发送数据的确认。本章我们将介绍TCP所使用的被称为滑动窗口协议的另一种形式的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必…...

鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢
近年来,随着全球能源消耗的不断增长和环境问题的日益突出,清洁能源转型成为全球共同关注的话题。中国作为全球最大的能源消费国,也在积极推动能源结构的优化和清洁能源的发展。鼎鑫鸿鄴新能源科技有限公司在推动清洁能源转型方面制定了一系列…...

Qt下实现支持多线程的单例模式
Qt下实现支持多线程的单例模式 Chapter1 Qt下实现支持多线程的单例模式($$$)1. 代码介绍2. 代码之路3. 详细分析3.1 什么是单例3.2 如何让类无法实例化3.3 如何调用这个唯一实例3.4 如何支持多线程3.5 如何解决内存泄漏 4. 结束语 Chapter2 Qt 全局单例类Chapter3 Qt实用技巧&a…...

基于Java的宠物商店管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

ArcGIS中批量mxd高版本转低版本
我们经常在给别人发ArcGIS的工程文件mxd,结果到别人那发现mxd工程文件打不开,原因是我们的arcgis版本高于别人,此时工程文件又很多,一个个转存成低版本又嫌麻烦,于是我们做了个批量mxd高版本转低版本的小工具ÿ…...

三篇论文:速览GPT在网络安全最新论文中的应用案例
GPT在网络安全领域的应用案例 写在最前面论文1:Chatgpt/CodeX引入会话式 APR 范例利用验证反馈LLM 的长期上下文窗口:更智能的反馈机制、更有效的信息合并策略、更复杂的模型结构、鼓励生成多样性和GPT类似的步骤:Conversational APR 对话式A…...

美术如何创建 skybox 贴图资源?
文章目录 目的PS手绘Panorama To CubemapPS手绘Pano2VRSkybox & Cubemap Tutorial (Maya & Photoshop)Unity 中使用 ReflectionProbe 生成 Cubemap 然后再 PS 调整PS直接手绘 cubemapBlender 导入 Panorama,然后烘焙到 cubemap,再导入unity中使用…...

【Linux 用户,用户组管理】
文章目录 什么是Linux用户和用户组用户(User)用户组(User Group) Linux用户和用户组管理命令1. 创建用户2. 删除用户3. 修改用户信息4. 创建用户组5. 将用户添加到用户组6. 用户和用户组的查询 用户和用户组管理实战 什么是Linux用…...

VS2022 C# 读取 excel 2023年
今天是2023年6月26日,我有一个excel表要读数据,然后放到winform程序来处理,网上的资料太旧,很多用不起来,试了一个可以使用,记录一下: 一、excel文件后缀需要小写。 二、用VS2022建一个winform…...

C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点
Chaikin算法——计算折线对应的平滑曲线坐标点 本文将介绍一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法,通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。通过对原始点集合进行切割和插值操作,得到平滑的曲线坐…...

day44
什么是前端 前端是所有跟用户直接打交道的都可以称之为是前端 比如:pc页面、手机页面、平板页面、汽车显示屏等等显示出来的都是前端内容 什么是后端? 就是一堆代码,用户不能够直接看到,不直接与用户打交道的都是后端 常见的后端…...

python常用操作汇总
python创建二维数组 python创建三行三列的二维数组,下面方法是错误的,因为是浅拷贝: lst1 [0] * 3 lst2 [lst1] * 3 lst2[1][1] 2 print(lst2) # [[0, 2, 0], [0, 2, 0], [0, 2, 0]]正确姿势 lst [[0 for j in range(3)] for i in ran…...