C语言中那些后知后觉的细节冷知识(二)typedef、死循环、位移、内存访问

本文主要是介绍C语言中那些后知后觉的细节冷知识(二)typedef、死循环、位移、内存访问,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

C语言中那些后知后觉的细节冷知识(一)static、const、volatile、数组、宏
C语言中那些后知后觉的细节冷知识(二)typedef、死循环、位移、内存访问
持续更新中… …


文章目录

  • 系列文章目录
  • 前言
  • 一、typedef
  • 二、死循环
  • 三、位移
  • 四、内存访问
  • 总结


前言

C语言诞生于1972年11月,由美国电话电报公司(AT&T)贝尔实验室的丹尼斯·里奇(Dennis Ritchie)发明,在1978年,美国电话电报公司(AT&T)贝尔实验室正式发布了C语言。C语言作为一种经典的编程语言,时至今日,仍然在许多领域仍然被广泛使用,并且仍然是一种强大、高效和灵活的编程语言。
学习C语言对于初学者来说可能有一定的难度,因为C语言是一种比较底层的编程语言,它提供了更接近计算机硬件的控制能力。与一些更高级的编程语言相比,C语言在语法和概念上可能更加复杂,需要更多的时间和精力来学习和掌握。
今天继续分享一些C语言的细节冷知识,主要涉及typedef、死循环、位移、直接内存访问等,希望对大家有所帮助。


一、typedef

在C语言中,typedef关键字用于为一个已经存在的类型创建一个新的名字。它通常用于帮助你简化代码、提高可读性,并为底层数据类型提供抽象。经常被用于为基本数据类型定义别名、为结构体定义别名、为枚举定义别名、为函数指针定义别名等。
与其比例类似的是宏定义#define,需要注意区别。比如以下例子:

#define dS struct s * typedef struct s * tS; 

以上两种情况的都是要定义dS 和 tS 作为一个指向结构s指针。哪种方法更好呢?答案是:typedef更好。思考下面的例子:

dS p1,p2;tS p3,p4;

第一个例子在宏定义展开替换后为“Struct s * p1, p2;”,定义p1为一个指向结构体的指针,而p2为一个实际的结构。而第二个例子正确的定义了p3和p4两个指向结构体的指针。
所以一般在用于为一个已经存在的类型创建一个新的名字时,应尽量使用typedef,而不是#define。

二、死循环

死循环即无限循环,其实是普通的循环结构,但是没有退出循环的条件,即实现了无限循环。C语言中一般有以下几种方式实现死循环:
1、while(1){ … … }
2、for(;😉{ … … }
3、结合goto,如:
Loop:
… …
goto Loop;

推荐使用第一种while(1);如果使用第二种for(;😉,你也要了解为什么这样写for语句代表无限循环(其实就是第二个“;”语句中未填写退出for循环的条件造成的);第三种比较少用,可能经常写汇编语言的程序员会使用这种方式,但是不推荐。在C语言中,goto语句是一种控制流语句,允许程序无条件地跳转到程序中的另一个位置,但是很多的编码标准都谈及了避免或限制使用goto,主要原因是使用goto会降低代码的可读性、破坏程序的结构化、增加调试难度等。

三、位移

在C语言中,位移操作被广泛应用于各种场景,主要是由于其能够高效地操作二进制数据。位移操作通常比乘法和除法操作更快,因此在对性能有要求的计算场景中,可以使用位移来替代乘法和除法(左移N位相当于乘以2的N次幂,右移N位则相当于除以2的N次幂)。
在C语言中使用位移操作符(左移 << 和右移 >>)时,需要注意以下几点:
1、操作数的类型:位移操作符通常应用于整数类型(如short 、int、long等)的操作数。对浮点数应用位移操作符是未定义的行为(各位可以查一查浮点数在内存中的存储方式,就知道为什么了);
2、符号位:对于有符号整数,位移操作可能会涉及到符号位(最高位)。左移时,符号位会被“推出去”,并从另一端补入新的位(通常是0,但取决于具体的实现)。右移时,符号位的行为取决于编译器:算术右移(保留符号位)或逻辑右移(不保留符号位);
3、位移量:位移量应该是非负整数,并且小于或等于被操作数类型的位数。例如,对于32位整数,有效的位移量范围是0到31。超出这个范围的位移量可能导致未定义的行为。在实际编程中,通常会使用无符号类型(如 unsigned int)的变量来存储位移量,以避免负值;
4、无符号整数与有符号整数的区别:对于无符号整数,位移操作通常是逻辑移位,即左移时补0,右移时也补0。而对于有符号整数,右移可能是算术移位(保留符号位)。

四、内存访问

C语言主要运用于嵌入式系统中,而嵌入式系统经常会要求程序员去访问某特定的内存位置,主要的方式就是采用将绝对地址的整型数强制转换为指针,从而进行内存访问。比如:

int *ptr;
ptr = (int *)0x123456;
*ptr = 0xAABB;
//或者
*(int *)(0x123456) = 0xAABB;

上述代码可以实现对绝对地址为0x123456的内存赋值为0xAABB的目的。


总结

以上都是一些C语言的基础,但却又是平时编程中很容易因为疏忽出现问题的地方。更多的细节冷知识将在后续系列文章中持续更新,希望对大家有所帮助。

这篇关于C语言中那些后知后觉的细节冷知识(二)typedef、死循环、位移、内存访问的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/678939

相关文章

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换