当前位置: 首页 > news >正文

【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_pIntpInt_const 分别表示哪些是只读的?

typedef int * pInt;
const pInt const_pInt;
pInt const pInt_const;

可能你会认为const_pInt表示指针指向的对象是只读的,而pInt_const表示指针本身是只读的。答案是,const_pIntpInt_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_pIntpInt_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类型的;
pSpSh都是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)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&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年香水行业数据分析:国人用香需求升级,高端香水高速增长

在人口结构变迁的背景下&#xff0c;“Z世代”作为当下我国的消费主力&#xff0c;正在将“悦己”消费推动成为新潮流。具备经济基础的“Z世代”倡导“高颜值”、“个性化”、“精致主义”&#xff0c;这和香水、香氛为代表的“嗅觉经济”的特性充分契合&#xff0c;因此&#…...

这可能是最简单的Page Object库

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

论文阅读——BERT

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

竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…...

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实现鼠标划过头像,头像突出变大(附源码)

话不多说&#xff0c;先上代码 先看原图&#xff1a; 再看 鼠标放上去后的图&#xff1a; 是不是明显感觉到 人物头像突出了一些&#xff0c;而且还增加了阴影部分的效果呢&#xff1f; 直接上代码&#xff01;&#xff01;&#xff01; <!--由于我的 img 标签放的是循环后…...

“爱知道”,你知道吗?

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

基于SpringBoot+Vue的服装销售系统

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

针对多分类问题,使用深度学习--Keras进行微调提升性能

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

一、【Photoshop如何根据不同类型图像抠图】

文章目录 前言图形结构1、规则图形2、不规则图形 图形颜色1、轮廓清晰2、颜色分明 前言 当我们有抠图需求的时候&#xff0c;不要一开始就想着我怎么去把它抠出来&#xff0c;首先应该分析图形的特点&#xff0c;然后再去选取合适的工具&#xff0c;这样才可以做到事半功倍&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环境变量用于记住程序路径&#xff0c;方便在命令行窗口的任意目录启动程序 \n代表换行的意思&#xff0c;/t代表一个tab前进一格 强转可能导致数据的丢失&#xff08;溢出&#xff09; 浮点型转换为整型&#xff0c;直接丢掉小数部分&#xff0c;保留整数部分返回 数据类…...

Go 语言访问 Redis 笔记

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

【MySQL数据库重点】第二节:MySQL基础知识(基本操作)

目录 一&#xff1a;数据库的操作 1.显示数据库 2.创建数据库 3.使用数据库 4.删除数据库 二&#xff1a;常用数据类型 1.数值类型&#xff1a;整型和浮点型 2.字符串类型 3.日期类型 三&#xff1a;表的操作 1.查看表结构 2.创建表 3.删除表 一&#xff1a;数据库…...

计算机网络--第一次作业

1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式&#xff0c;通信之前要在通信双方之间建立一条被双方独占的物理通道&#xff08;由通信双方之间的交换设备和链路逐段连接而成&#xff09;。 优点&#xff1a; ①由于通信线路为…...

网络协议--TCP的成块数据流

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

鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢

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

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...