C语言
文章平均质量分 73
C语言基础知识
饼干烧饼
Orz
展开
-
初步理解指针
既然我们把地址存在指针变量中,也不能只存着啊,总不能占着茅坑不拉*吧,总要发挥指针变量的用处,所以就有了解引用操作符(*),我们就可以拿着房间号(地址)去找某人了(指向对象)。可以看到a被修改了,有没有一种被偷家的感觉,通过指针解引用能间接修改a的值,所以const修饰的是a,只要我们想到其他办法绕过a就i能修改a的值。还是一上面那段代码为例,p的左边是int*,*在说明p是一个指针变量,int在说明这个指针指向的对象是int类型(即a)(这两句话要牢牢记住),int*即为p的指针类型。原创 2023-11-25 22:46:26 · 959 阅读 · 0 评论 -
循环结构程序
循环条件为 a原创 2023-10-28 08:55:25 · 111 阅读 · 0 评论 -
数组相关知识总结
数组是 C 语言中的一种重要数据结构,它是一组有序数据的集合,存储在数组中的值称为数组元素。以上是对 C 语言数组相关知识的总结,包括声明、初始化、访问、遍历、长度计算、边界检查和排序等操作,如有错误或补充欢迎指出和补充。解析:访问数组 a 的元素,当索引超出边界时,输出“Out of bounds”。解析:定义了一个简单的冒泡排序算法,对数组 arr 进行排序,并打印排序后的结果。解析:计算数组 a 的长度(注意:这里假设数组 a 是二维数组)。解析:遍历并打印二维数组 a 的所有元素。原创 2023-11-03 23:05:01 · 102 阅读 · 0 评论 -
打印规定范围内的水仙花数
1.第一步为数字位数的判断,通过每次除10对count进行加1,当tmp为0是,跳出while循环,对count的累加即为i的位数。2.第二步为计算每一位的次方和,这里用到了pow函数来求每一位数的次方,再计算次方的和,下面为pow函数的介绍。此题的关键在于只要知道判断一个数据是否为水仙花数的方式,问题就迎刃而解。3. 对i中每个位上的数据次方求和完成后,在检测其结果是否与i相等即可,4.最后判断是否为水仙花数,求得的次方和i相等就是水仙花数,反之相反。2. 获取i中每个位置上的数据,并对其进行次方求和。原创 2023-11-05 17:04:05 · 125 阅读 · 2 评论 -
用c语言实现简易版操作台扫雷
对于show函数,我们需要它让玩家不知道对应坐标是否为雷,所以我们将它用字符*来隐藏,同时也需要让它显示其周围的雷的个数,统计雷的个数我们后面讲解。6.接下来就需要给玩家显示一个9*9的*阵进行排雷了,那么就需要一个打印数组的函数来对显示数组进行打印。对于mine数组,可以用0表示非雷,1表示雷,先对所有数组元素赋值为字符0,对于埋雷,我们在后面讲解。1. 游戏界面:游戏界面采用*阵来显示,*可能是雷,也可能不是雷,并可以显示周围8格的雷数。对于数组赋值,我们可以用一个函数来实现对两个数组的赋值。原创 2023-11-04 00:15:27 · 152 阅读 · 1 评论 -
atoi函数的使用和模拟实现
第二,当指针在指向数字字符之前指向其他字符(除数字字符和空白字符以外的字符),不会进行第二个while循环进行计算,此时num == 0,则返回值为0;c.用sign控制符号的正负,并初始化为1,这里进行初始化是有必要的,假设没有初始化(同时对if语句修改),当数字字符前有’+‘’-‘号则结果正常,当数字字符前面没有’+‘’-‘号是则可能报错,因为此时sign没有初始化并且没有进入分支语句,所以是随机值,在返回值时是可能会溢出。c.数字字符前面有’+‘ ’-‘字符则作为整数的正负处理;原创 2023-11-30 12:08:26 · 508 阅读 · 0 评论 -
分支结构程序
先来讲讲 if 语句吧先来讲讲 if 语句吧。原创 2023-10-28 00:04:22 · 182 阅读 · 2 评论 -
文件与文件操作
既然FILE是一种结构类型,那么FLIE*指针类型的变量指向的是一个结构体变量,即指向某个文件的文件信息区,通过文件信息区中的信息就能访问该文件,也就是说通过FILE*类型的文件指针变量就能够间接找到与它关联的文件。在数据通过流进行传输的过程中,缓冲区可以帮助提高数据传输的效率,减少频繁的读写操作,从而提高程序的性能。前面讲文件的顺序读写,进行读写都是从文件的开头开始的,那如果要从文件的某一位置开始读写,就要用到相应函数实现文件的随机读写(随机读写并非无任何规律地读写,而是指文件读写时的起始位置可以指定)原创 2023-12-15 18:00:35 · 925 阅读 · 2 评论 -
offsetof的模拟实现
3. `&((type *)0)->member`:最后,我们使用`&`操作符来获取成员的地址。这里的`&`操作符告诉编译器获取`((type *)0)->member`的地址,也就是`member`在结构体中的偏移量。2. `((type *)0)->member`:现在我们有了一个指向`type`类型的指针,我们可以使用`->`操作符来访问结构体的成员。即`&((type *)0)->member`的结果是`member`在`type`类型的结构体中的偏移量。原创 2024-01-19 15:47:16 · 438 阅读 · 0 评论 -
自定义类型:联合体和枚举
与结构体相似,联合体也是由一个及以上的成员组成,成员可以是不同类型的数据;但与结构体不同的是,编译器只给最大的成员分配足够的内存空间,即所有成员共用一块内存空间,所以联合体也叫做共用体。这里十分巧妙地利用了联合体的共用内存的特性,将1赋值给int类型的i,在通过char类型的c访问一个字节,进而判断大小端。既然联合体的成员共用同一块内存,那么这个联合体至少要保证最大的成员,所以联合体的大小至少是最大成员的大小。2.#define定义常量是无类型的,enum定义的标识符是有类型的,会有类型检查,会更加严谨。原创 2023-12-03 14:58:44 · 934 阅读 · 1 评论 -
预处理详解
已经设置的预定义符号,可以直接使用,预定义符号在预处理期间处理.原创 2024-01-19 12:13:58 · 758 阅读 · 0 评论 -
自定义类型:结构体
位段的几个成员共有同一个字节,这样某个位段的起始位置并不是某个字节的起始位置,那么这些位段是没有地址的,内存为每个字节只分配一个地址,在一个字节内部的bit位是没有地址而言的,所以不能对位段使用&取地址,也不能使用scanf输入值给位段,只能先scanf输入放在一个变量中,再将这变量的值赋值给位段成员。我们知道,传值过程中,是将实参的信息传递给形参,形参是实参的临时拷贝,因为传参是需要压栈的,会有时间和空间上的开销,如果结构体的成员比较大(如上面的arr【100】),则开销就越大,导致性能下降。原创 2023-12-03 11:33:05 · 874 阅读 · 1 评论 -
关于整数和浮点数在内存中的存储
在数据存储中,整数与浮点数在内存中的存储方式有很大的差别,下面我们将分别探讨它们的存储方式。目录1.整数在内存中的存储2.大小端字节存储和字节序判断2.1何为大小端?2.2设计程序判断机器的字节序存储方式3.整型提升与补码的深层含义3.1 在c语言中,整型算术运算总是至少以缺省整型类型(int / unsigned int)的精度来进行的。为了获得这个精度表达式中字符型(char)和短整型(short)操作数在使用之前被转换为原创 2023-12-02 12:00:27 · 967 阅读 · 1 评论 -
编译与链接
这里定义了两个源文件,上面讲过,每个源文件都是单独经过编译器生成对应的目标文件,我们在project.c文件使用add.c中的add函数时,必须明确函数的地址,再去调用函数,但每个文件都是单独编译的,project.c文件并不知道add函数的地址,所以将add的调用地址搁置,等到最后链接的时候由来链接器根据引用的符号add在其他模块中查找add函数的地址,然后修正project.c中所用引用到add的指令,让它们的目标地址为真正的add函数的地址,修正地址的过程称为重定位。翻译环境可以分为编译与链接。原创 2024-01-19 00:46:39 · 380 阅读 · 0 评论 -
动态内存管理
常规的变量定义声明后内存空间大小就一般不变了,而有些情况是只有我们将程序运行后才知道所需的内存空间大小是多少,那么这就需要动态内存开辟,以便可以自己申请和释放空间。原创 2023-12-08 23:19:33 · 955 阅读 · 0 评论 -
写一个宏,将一个整数的二进制位的奇数位和偶数位交换
将num &(0xAAAAAAAA)(10101010101010101010101010101010),可以得到原来num的偶数位不变,奇数位全为0,将其右移一位变成奇数位;将num & (0x55555555)(01010101010101010101010101010101),可以得到原来num的奇数位不变,偶数位全为0,将其左移一位变成偶数位;将左右移的数进行按位或,得到奇数位偶数位交换后的数。原创 2024-01-19 14:53:18 · 401 阅读 · 0 评论