【C语言|关键字】C语言32个关键字详解(4)——其他(typedef、sizeof)

news2024/9/30 15:23:56

😁博客主页😁:🚀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个关键字全部介绍完了。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Redis 如何统计一亿个 keys ?

目录 1、聚合统计 2、排序统计 3、二值状态统计 4、基数统计 总结 // 淡泊明志&#xff0c;宁静致远 在 Web 和移动应用的业务场景中&#xff0c;我们经常需要保存这样一种信息&#xff1a;一个 key 对应了一个数据集合。举几个例子&#xff1a; 手机 App 中的每天的用户…

任务调度器详解(FreeRTOS)

目录 什么是任务调度器 FreeRTOS的任务调度器 抢占式调度 协作式调度 时间片调度 什么是任务调度器 任务调度器是实时操作系统&#xff08;RTOS&#xff09;的一个关键组件&#xff0c;它负责决定在多个可运行任务中哪一个将获得CPU时间以执行。它基于任务的优先级和状态来…

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题&#xff08;√&#xff09;二、2021年真题三、2020年真题&#xff08;√&#xff09;四、2019年真题&#xff08;√&#xff09;五、2018年真题&#xff08;√&#xff09;六、2017年真题&#xff08;√&#xff09;七、2016年真题&#xff08;√&…

Remmina Linux 远程桌面(堡垒机)解决方案,含文件互传

简介 Remmina 是一款在 Linux 和其他类 Unix 系统下的自由开源、功能丰富、强大的远程桌面客户端。 对于一个Linux作为主力开发机而言&#xff0c;Remmina 解决痛点主要是公司堡垒机远程客户现场的计算机&#xff0c;公司只给开发了win系统下的远程连接程序&#xff0c;而没有…

SQLi靶场

SQLi靶场 less1- less2 &#xff08;详细讲解&#xff09; less 1 Error Based-String (字符类型注入) 思路分析 判断是否存在SQL注入 已知参数名为id&#xff0c;输入数值和‘ 单引号‘’ 双引号来判断&#xff0c;它是数值类型还是字符类型 首先输入 1 &#xff0c; 发现…

IDEA在GitHub / Gitee中拉取特定一个分支代码方法

IDEA通过HTTP / SSH拉取项目的时候&#xff0c;默认都是拉取master分支的节点代码&#xff0c;对于我们通过分支来逐一消化项目的需求是相违背的&#xff0c;那么下面就是如何对一个项目特定分支读取方法 首先正常通过HTTP / SSH拉一个项目下来 打开分支列表&#xff0c;选择指…

一文了解GC垃圾回收

一文了解GC垃圾回收 1 判断一个对象为垃圾对象的方法 引用计数法(弃用) 可达性分析算法 是否有指向GC root 的引用链&#xff0c;如果有&#xff0c;不是垃圾对象 ---->GC roo:即rt.jar包中内容 2 内存泄漏与内存溢出区别 泄漏&#xff1a;原本需要被回收的对象&#…

Python 深度学习入门之CNN

CNN 前言一、CNN简介1、简介2、结构 二、CNN简介1、输出层2、卷积层3、池化层4、全连接层5、输出层 前言 1024快乐&#xff01;1024快乐&#xff01;今天开新坑&#xff0c;学点深度学习相关的&#xff0c;说下比较火的CNN。 一、CNN简介 1、简介 CNN的全称是Convolutiona…

英语——语法——从句——名词性从句——笔记

文章目录 名词性从句一、定义二、分类&#xff08;一&#xff09;宾语从句&#xff08;二&#xff09;主语从句&#xff08;三&#xff09;C同位语从句&#xff08;四&#xff09;D表语从句 名词性从句 一、句子成分 简而言之&#xff0c;构成一个句子的成分&#xff08;或要素…

关于 provide、inject 在Vue3中的用法

Vue3关于 provide、inject 的用法 一、传递变量/数据二、传递函数 前言&#xff1a; 在父子组件传递数据时&#xff0c;通常使用的是 props 和 emit。 父传子时&#xff0c;使用的是 props&#xff0c;如果是父组件传孙组件时&#xff0c;就需要先传给子组件&#xff0c;子组件…

STM32:TTL串口调试

一.TTL串口概要 TTL只需要两个线就可以完成两个设备之间的双向通信&#xff0c;一个发送电平的I/O称之为TX&#xff0c;与另一个设备的接收I/O口RX相互连接。两设备之间还需要连接地线(GND)&#xff0c;这样两设备就有相同的0V参考电势。 二.TTL串口调试 实现电脑通过STM32发送…

高等数学啃书汇总重难点(六)定积分的应用

无论是考研还是学校期末考试&#xff0c;这一部分的内容都不会太难&#xff0c;因此今天的内容一页笔记就足够放的下了。 重点在于理解所谓的元素法——也就是微元法&#xff0c;即定积分的几何意义。只不过&#xff0c;定积分几何意义的引例为平面问题&#xff0c;实际上&…

Spring初步了解到深入理解

文章目录 1.Spring1.1简介1.2优点1.3组成1.4拓展 2.IOC理论推导3.Hello Spring下面牵扯到的地址: 4.IOC创建对象的方式1.使用无参构造创建对象&#xff0c;默认2.假设我们要使用有参构造创建对象1.下标赋值2.类型3.参数名 5.Spring配置5.1别名5.2bean的配置5.3import 6.依赖注入…

Monocular arbitrary moving object discovery and segmentation 代码复现

环境 https://github.com/michalneoral/Raptor 1.创建environment.yaml name: raptor channels:- pytorch- conda-forge dependencies:- python3.8- pytorch1.9.0- torchvision0.10.0- cudatoolkit11.1- pipconda env create -f environment.yaml conda activate raptor2.安…

C++基类和派生类的内存分配,多态的实现

目录 基类和派生类的内存分配基类和派生类的成员归属多态的实现 基类和派生类的内存分配 类包括成员变量&#xff08;data member&#xff09;和成员函数&#xff08;member function&#xff09;。 成员变量分为静态数据&#xff08;static data&#xff09;和非静态数据&…

技术分享 | 针对蜜罐反制Goby背后的故事

0x01 概述 近期我们联动FORadar做了一个插件&#xff0c;实现了从企业名称->企业漏洞的全自动检测流程&#xff0c;在做具体实践的时候碰到了两个很有意思的蜜罐&#xff0c;其中一个蜜罐内置了Weblogic漏洞&#xff0c;同时配置有专门针对旧版本Goby反制Payload&#xff0…

点亮现代编程语言的男人——C语言/UNIX之父Dennis Ritchie

祝各位程序员们1024程序员节快乐&#x1f389;&#x1f389;&#x1f389; 图片来自网络&#xff0c;侵删 前言 在程序员中&#xff0c;有一位人物的不被人熟知&#xff0c;他的贡献甚至比他自身更要出名 C语言之父&#xff0c;UNIX之父——Dennis MacAlistair Ritchie 一…

0基础学习PyFlink——使用Table API实现SQL功能

在《0基础学习PyFlink——使用PyFlink的Sink将结果输出到Mysql》一文中&#xff0c;我们讲到如何通过定义Souce、Sink和Execute三个SQL&#xff0c;来实现数据读取、清洗、计算和入库。 如下图所示SQL是最高层级的抽象&#xff0c;在它之下是Table API。本文我们会将例子中的SQ…

【机器学习合集】深度学习模型优化方法最优化问题合集 ->(个人学习记录笔记)

文章目录 最优化1. 最优化目标1.1 凸函数&凹函数1.2 鞍点1.3 学习率 2. 常见的深度学习模型优化方法2.1 随机梯度下降法2.2 动量法(Momentum)2.3 Nesterov accelerated gradient法(NAG)2.4 Adagrad法2.5 Adadelta与Rmsprop法2.6 Adam法2.7 Adam算法的改进 3. SGD的改进算法…