自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 Win32 API 和 类项

贪吃蛇项目所需知识

2025-08-06 18:01:38 857

原创 数据结构-双链表

双链表

2025-08-03 23:17:21 1073

原创 移除链表元素+反转链表+链表的中间节点+合并两个有序链表+环形链表约瑟夫问题+分割链表

单链表算法题:文字+图形结合讲解,看完包会

2025-07-31 01:30:49 773

原创 数据结构-单链表

1.中间/头部的插⼊删除,时间复杂度为O(N)2.增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。3.增容⼀般是呈2倍的增长,势必会有⼀定的空间浪费。例如当前容量为100,满了以后增容到 200,我们再继续插⼊了5个数据,后面没有数据插⼊了,那么就浪费了95个数据空间。总结就是顺序表的中间/头部插入效率低下,增容降低了运行效率,增容造成空间浪费思考:如何解决以上问题呢?通过可以解决以上的问题。

2025-07-28 00:46:47 878

原创 练习(移除元素+合并两个数组)

有一个数组 nums 和一个变量 val,你需要移除所有数值等于val的元素,并返回移除后数组的新长度,不要使用额外的数组空间示例:输入:nums={3,2,2,3},val=3 输出:2,nums={2,2}输入:nums={0,1,2,2,3,0,4,2},val=2 输出:5,nums={1,3,0,4,2}思路:使用创建两个变量 src(源数据)和 dst(目标数据),1)若src指向的值为val,src++,

2025-07-19 14:31:02 641

原创 数据结构--顺序表

数据结构是由“数据”和“结构”两词组合而来。什么是数据?常见的数值1、2、3、4.....、教务系统里保存的用户信息(姓名、性别、年龄、学历等等)、网页里肉眼可以看到的信息(文字、图片、视频等等),这些都是数据什么是结构?当我们想要使用大量使用同⼀类型的数据时,通过手动定义大量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在⼀起,结构也可以理解为组织数据的方式。

2025-07-19 02:14:59 983

原创 练习(包含offsetof宏的实现及整数二进制奇偶位互换宏实现)

而使用 typedef 对 INT_ptr 进行重命名为 int*,相当于定义了新的类型 int*(指针类型),结果等同于int* a,int* b;到奇数位上,而10101010的十六进制是0xaa,整数为4个字节,即32位二进制位,即 - >我们知道,一个变量的地址是它在内存中所占用的连续字节空间中最小的那个字节(即最低地址)的地址。,结果为01010101,就只保留了奇数位的数,然后再向。思路:假设整数a的二进制位的第一位就是奇数位,想要实现。,结果为10101010,就只保留了偶数位的数,然后。

2025-07-08 17:06:33 842

原创 C预处理详解2

许多C的编译器提供了⼀种能力,允许在命令行中定义符号。用于启动编译过程。例如:当我们根据同⼀个源文件要编译出⼀个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了⼀个某个长度的数组,如果机器内存有限,我们需要⼀个很小的数组,但是另外⼀个机器内存大些,我们需要⼀个数组能够大些。例如:(使用VS code gcc)我们写一个打印数字的代码,创建一个变长数组,此时我们可以在命令行输入命令:我们可以自行规定数组的长度,此时所设置的长度是10,那么运行起来(在命令行输入.\test.exe。

2025-06-24 22:45:10 1042

原创 C预处理详解1

C语言设置了⼀些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。__FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循 ANSI C ,其值为1,否则未定义这些预定义符号都是语言内置的int main()return 0;

2025-06-22 23:15:55 1153

原创 C编译与链接

在test.c 和 add.c 两个文件单独编译(汇编期间)完后,会生成各自的符号表(即函数或全局变量的地址),然后再通过链接将它们的地址进行修正(重定位),例如,此时g_val 变量真正的地址是0x100,而此时也是可以发现被调用的函数或变量未定义的时候,例如,我们不小心将函数Add写成 add,此时就会报错。

2025-06-22 01:16:46 726

原创 练习(含atoi的模拟实现,自定义类型等练习)

1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少?2.在VS2022下,默认对齐数为8字节,这个结构体所占的空间大小是多少字节3.当A=2,B=3时,pointer分配了几个字节空间?(位段的几个成员共用一个字节,如果一个字节内剩余的空间(比特位)不足以放下下一个成员,会浪费掉这些空间,重新在开辟一个字节来继续存放)当然我们也可以打印出来看看:4.以下代码的结果是什么?

2025-06-10 17:34:01 945

原创 文件(保存)通讯录

在前面的文章中,我们已经学完了通讯录代码及动态增加版本,但是,当退出程序时,先前增删查找的所有联系人就会销毁,那么,我们想要将其保存起来而不被销毁,就可以将所有内容都保存在文件中。

2025-06-07 18:56:52 359

原创 C文件操作2

这些函数都需要包含头文件。

2025-06-06 23:01:27 1092

原创 C文件操作1

磁盘(硬盘)上的文件是文件。程序文件、数据文件(从文件功能的角度来分类的)这些函数都包含头文件函数名 功能 适用于fgetc 字符串输入函数 所有输入流fputc 字符串输出函数 所有输出流。

2025-05-31 00:07:10 863

原创 动态内存管理2+柔性数组

(如程序崩溃、数据错误、输出乱码等)。改正:

2025-05-19 00:00:00 845

原创 动态通讯录程序

我们学习了动态内存管理知道,calloc等函数在使用完后,需要我们进行手动释放及置空,因此,我们可以在最后增加一个销毁通讯录函数,来进行这些操作。,现在我们可以在此结构体上增加一个变量,代表当前通讯录的最大容量,当达到最大容量时,再动态的增加新的存放空间。动态版本不需要再判断是否满员,只要有需要就会动态增加空间,因此我们需要确定的是什么时候需要增加空间——既然是动态增加,那么就没有联系人满员的情况,因此通讯录。,将该程序中可为动态变化的部分修改为动态的版本。,就说明需要增加空间了,我们可以写一个函数。

2025-05-18 14:42:04 296

原创 动态内存管理

但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小的时候才能知 道,那数组的编译时开辟空间的方式就不能满足了。C语⾔引入了。这些函数都是存放在的,需要手动开辟内存空间,生命周期由程序员控制,而在栈区的局部变量或函数,随函数调用的结束自动释放。

2025-05-17 16:17:28 981

原创 通讯录程序

假设通讯录可以存放100个人的信息(人的信息:姓名、年龄、性别、地址、电话)功能:1>增加联系人 2>删除指定联系人 3>查找指定联系人信息 4>修改指定联系人信息5>显示所有联系人信息 6>排序(姓名、年龄)根据前面三子棋等游戏,我们知道需要创建三个文件,- 测试通讯录- 通讯录的实现- 函数的声明我们首先写出整体的代码(第二步我们使用结构体类型来存放人的信息并声明所创建的通讯录(接下来创建通讯录及初始化通讯录(初始化通讯录(

2025-05-13 22:48:32 833

原创 自定义类型:枚举、联合

enum Sex//性别MALE,FEMALE,SECRETenum Day//星期Mon,Tues,Wed,Thur,Fri,Sat,Sunenum Color//颜色RED,GREEN,BLUE以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

2025-05-12 23:48:08 718

原创 自定义类型:结构体进阶

位段 - 位 - 二进制位位段的声明和结构是类似的,有两个不同:1. 位段的成员必须是 int、unsigned int 或signed int(可以是char) ,在C99中位段成员的类型也可以选择其他类型。2. 位段的成员名后边有⼀个冒号和⼀个数字。int _b:5;int _c:10;int _d:30;A就是⼀个位段类型。那位段A所占内存为什么是8呢?

2025-05-10 16:44:49 655

原创 内存函数.

前面我们学习的字符串函数只是针对于字符串的,对于其他的类型,如int等,是无法使用的,而,就可以对。

2025-05-04 06:00:00 752

原创 字符函数和字符串函数

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量 适用于那些对它不做修改的字符串函数.strlen 是求字符串长度的,求出的长度不可能为负数,所以返回类型设置为size_t字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含\0)参数指向的字符串必须要以 '\0' 结束。注意函数的返回值为size_t,是无符号的。

2025-05-03 16:16:56 668

原创 指针的进阶3

数组名的意义:1.

2025-04-25 00:16:52 723

原创 练习(杨辉三角、字符串旋转)

以下程序执行的结果: 二、猜名次题目内容 :5位运动员参加了代米台跳水比赛,有人让他们预测比赛结果A选手说 : B第二,我第三;B选手说:我第二,E第四:C选手说:我第一,D第二D选手说 : C最后,我第三E选手说 : 我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。思路:a,b,c,d,e都假设一遍(每一个人都假设为第 1 2 3 4 5 名)至少有一个为真:1+0=1 0+1=1;例如A选手 (b == 2)+(a == 3) == 1 如果我们按

2025-04-18 18:36:52 623

原创 指针的进阶2

字符指针数组 - 存放字符指针的数组 char* arr[10]整型指针数组 - 存放整型指针的数组 int* arr[10]解释pf 先和[ ]结合,说明 pf是数组,数组的内容是 int (*)()类型的函数指针。

2025-04-12 17:24:13 747

原创 指针的进阶1

字符指针 - 存放字符地址的指针 - 指向字符数据的指针 char*整形指针 - 存放整形地址的指针 - 指向整型数据的指针 int*浮点型指针 - 指向浮点型数据的指针 float* double*数组指针 - 存放数组地址的指针- 指向数组的指针数组指针变量解释:p先和*结合,说明p是⼀个指针变量,然后指针指向的是⼀个大小为10个整型的数组。所以p是 ⼀个指针,指向⼀个数组,叫 数组指针。这⾥要注意:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

2025-04-10 06:00:00 1257

原创 C进阶-数据的存储

数组类型 int arr[10] - 类型:int [10]结构体类型 struct枚举类型 enum联合类型 union大端字节序存储:把一个数据的低位字节的内容存放在高地址处,高位字节的内容存放在低地址处小端字节序存储:把一个数据的低位字节的内容存放在低地址处,高位字节的内容存放在高地址处为什么会有大小端模式之分呢?这是因为在计算机中,我们以字节为单位,每个地址单元都对应着一个字节,一个字节为8 bit。

2025-04-09 06:00:00 760

原创 练习(含指针数组与数组指针的学习)

‌数组指针‌是一个指针,指向一个数组的首地址,它用于指向整个数组,而不是数组中的某个元素。例如,int (*p)表示 p 是一个指向包含 5 个整数的数组的指针。‌‌数组指针‌声明时使用括号明确,如,其中()的优先级高于[ ],因此p首先被定义为一个指针,然后指向一个大小为10的数组。‌指针数组‌是一个数组,其元素都是指针,它用于存储多个指针,每个指针可以指向不同的数据。例如,int *p 表示 p 是一个包含 5 个整型指针的数组。‌‌指针数组‌声明时。

2025-04-08 22:54:41 905

原创 实用调试技巧2

1.代码运行正常2.bug少3.效率高4.可读性高5.可维护性高6.注释清晰7.文档齐全1.使用assert2.尽量使用const3.养成良好的编码风格4.添加必要注释5.避免编码的陷阱。

2025-03-30 01:00:00 782

原创 实用调试技巧

Debug 通常称为调试版术,它包含调试信息,并且不作任何优化,便于程序员调试程序。可进行调试Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。不能进行调试例如以下代码:切换Debug和Release版本的结果不同,有可调式和不可调试的区别,而大小也不同,Release版本更加优化在环境中选择Debug选项,才能使代码正常调试VS2022 - IDE - 集成开发环境 - >编辑器+编译器+调试器。

2025-03-29 01:00:00 1503

原创 练习(含认识大小端机器)

数组中元素是以二进制的形式存储的,在内存中,通常用十六进制来显示,8位十六进制数等于32位二进制数,2位十六进制数等于8位二进制数(1个字节=8bit);“水仙花数”是指一个n位数,其各位数字的n次方之和恰好等于该数本身,如:153=1^3+5^3+3^3,则153是一个水仙花数。,与我们习惯的书数字的顺序一致,例如:十进制数“123456”中,最高位“1”在最左边,最低为“6”在最右边,(数据的高位字节存储在内存的低地址处,低位字节存储在高地址处),与我们习惯的书写数字的顺序相反,最低为“6”在最左边,

2025-03-28 20:34:05 854

原创 初阶结构体

struct Stu//结构体成员int age;结构体也可以嵌套struct Sint a;char c;struct S s;float f;

2025-03-20 20:40:18 329

原创 初阶指针.

64位机器上,地址是8个字节,指针变量大小是8个字节,无论是什么类型的指针变量,都是4/8个字节,那为什么不统一一个指针变量类型来表示呢?要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,我们就可以给指针变量相应的类型,例如,int*、char*、float*……----> * - 表示ppa是一个二级指针变量,int* - 表示ppa所指的变量pa是一个整形指针。如果是char*的指针,解引用访问1个字节,int*的指针,解引用访问4个字节,float*的指针 -----4个;

2025-03-20 14:42:57 923

原创 一些练习.

从2到n+1行,每一行输入m个整数,用空格隔开,共输入n*m个数,表示一个矩阵中的元素。),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。的整数(unsigned int),size_t -- 是sizeof 计算的结果类型。在创建一个数组,将除了要删除的数字之外的元素都存放在此数组中,然后再打印出来。输出:针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。输入一个正整数n,输出一行,为正整数n表示为六进制的结果。

2025-03-16 22:27:31 698

原创 操作符详解2

a一开始的值为0,而a++是先使用,后++,即此时a++=0,整个式子就不用再进行计算了(&&全真才为真,有一个假就为假),所以最终就只有a参与了计算,a=1,其他的变量还是原来的值,且 此时。:同上,操作符的优先级只能决定自 -- 的运算在+的运算的前面,但是我们并没有办法得知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。:此表达式在计算的时候,由于*比+的优先级高,只能保证,*的计算是比+早,但是优先级并不能决定第三个*比第一个+早执行。

2025-03-11 12:06:25 998

原创 操作符详解1

:逻辑反操作:负值:正值:取地址sizeof:操作数的类型长度(以字节为单位):对一个数的二进制按位取反--:前置、后置--++:前置、后置++:间接访问操作符(解引用操作符)(类型):强制类型转换双目操作符:如 a+1,+操作符有两个操作数,像这样的有2个操作数的称为双目操作符而单目操作符就是只有一个操作数int main()//C语言中0表示假,非0表示真if(flag)return 0;int main()//C语言中0表示假,非0表示真if(!flag)

2025-03-06 19:13:33 838

原创 数组的应用实例2:扫雷游戏

我们可以设要排查的坐标为(x,y),周围的8个格子的坐标在此基础上进行加减,然后再将这8个格子进行相加,减去 8 * '0'(8*48),这样如果周围8个都没有雷,则结果为0,如果有,例如:周围有一个雷,'1'+'0'+'0'+'0'+'0'+'0'+'0'+'0'-8 * ‘0’ = 1 = n,然后通过 n + '0' =1 + 48 = 49,即为符号'1',是雷。的数组,而我们主要打印的是show函数,设置如果是雷的话放。,为了防止坐标越界,我们给数组的行增加2行,列增加2列,即。

2025-03-02 15:42:21 340

原创 数组的应用实例1:三子棋

正常3*3数组的行数坐标是0~2,列数的坐标是0~2,但是玩家在下棋的时候会认为都是1~3,所以我们设置坐标时应该设置成坐标都是1~3;运行代码我们发现3*3数组已经在屏幕上显示出来了,但是比较难看,因此,我们需要对这个棋盘进行进一步加工,将这个3*3的棋盘变成一个一个小方格。,这样就可以方便修改(如:可以方便改成一个10*10的数组),而我们想要能够使用,可以在test.c中引用一下game.h,但是,当我们把3*3数组改为10*10的时候,会发现列数。我们需要存储数据,需要一个。

2025-02-28 23:04:48 381

原创 猜数字游戏

来实现,rand函数是专门用来生成随机数的,它返回的是0~RAND_MAX(32767)之间的一个随机数。此时再次运行会发现每一次的数字都一样【将srand(),()内的数字改为1等其他数字,结果也一样】,这样就能生成每一次都不一样的随机数,并且time函数需要引入一个头文件。,time函数的参数类型是一个指针,此时我们不需要,可以将它的参数设置为。,时间戳是从1970年1月1日(UTC/GMT的午夜)所经过的秒数。(时间戳=现在的时间 - 19701.1),而在C语言中,1)猜小了,程序会告诉你猜小了。

2025-02-25 21:57:55 252

原创 数组222

往往我们在写代码的时候,会将数组作为参数传个函数,比如:实现一个(这里要讲算法思想)函数冒泡排序思想:两两相邻的元素进行比较,有可能的话需要交换将一个整形数组排序。

2025-02-23 21:27:09 375

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除