自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 简单贪吃蛇的实现

贪吃蛇的实现是再windows控制台上实现的,需要win32 API的知识Win32 API-CSDN博客。

2024-05-12 20:43:20 690 1

原创 Win32 API

Win32 APIWindows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows32位平台的应⽤程序编程接⼝。

2024-05-11 11:16:25 606 1

原创 单链表实现通讯录

首先创建头文件,用来放置函数的声明。在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址,因此要先解引用后链接(->相当于一层解引用)删除操作需要先找到要删除的联系人使用contact* findContact(contact* con, char a[])函数。printf("姓名:%s ", con->pival->name);printf("地址:%s", con->pival->addr);printf("性别:%s", con->pival->sex);

2024-04-25 11:25:20 628 2

原创 单链表的实现(单链表的增删查改)

第二种*pphead不为空,创建一个node等于*pphead,循环向后找,找到node->next为空时,node->next = newnode。当不为头节点时创建prev使用while循环,当 prev->next=pos时退出,让prev的下个节点指向newnode,newnode的下个节点指向pos。在这里我想用*pphead->next可是会报错,这是为什么呢,因为优先级,->的优先级比*的优先级高,pphead先与->结合,因此报错。一个节点直接删除即可,多个节点,将头节点指向第二个节点。

2024-04-17 21:31:47 785 1

原创 使用顺序表实现通讯录

通讯录都有什么功能呢,有增加联系人,删除联系人,查找联系人,修改联系人,还有通讯录的查看,还有什么呢,还要有退出功能。printf("***************通讯录***************\n");printf("*****5.查看通讯录 0. 退 出 *****\n");printf("*****1.增加联系人 2.删除联系人*****\n");printf("*****3.查找联系人 4.修改联系人*****\n");printf("请输入你要查找的名字:\n");

2024-04-12 13:16:16 773 2

原创 顺序表的增删查改

第一次进入时数组a为空,故要先开辟空间,又或者当空间满了,即ps->size 和 ps->capacity相等时开辟空间,一般是开辟2倍的空间。首先顺序表的创建需要用到结构体,顺序表中包含三个变量,分别是数组(存储数据),有效数据个数,数组的大小。//并且pos要

2024-04-09 20:54:01 534 2

原创 编译和链接

c文件经过编译处理后产生对应的目标文件,在windows环境下的目标文件后缀是.obj,Linux环境下目标文件的后缀是.o。这个过程是被隐藏起来的,现在的开发环境都是集成开发环境(IDE),用下图来直观的表达编译与链接的实现。处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。如果学习过编译原理,就会知道编译程序的过程,即源程序转换成逻辑上等价的目标程序的过程。翻译环境是由编译和链接两个大的过程组成,编译又可分为:预处理,编译,汇编三个过程。3.开始执行程序代码。

2024-04-05 16:26:48 668 2

原创 深度理解文件操作 fgetc和fputc fgets和fputs fscanf和fprintf fread和fwrite sscanf sprintf fseek ftell rewind feod

在C语言中,你可以使用标准输入流(stdin)来接收用户输入,也可以使用文件输入流来读取文件中的数据。它将读取的数据转换为相应的数据类型,并按照格式字符串的指示将数据存储到相应的变量中。数据文件:文件的内同 不一定是程序,而是程序员运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出的文件。函数会从指定的文件流中读取一行数据(包括换行符),并将其存储到指定的字符数组中。fwrite四个参数,第一个是要写数据的起始地址,第二个是一个元素的大小,第三个是写入的个数,第四个是流。

2024-03-26 20:55:26 1083 2

原创 函数栈帧的创建和销毁

又创建了edx和ecx两个寄存器,暂时储存a和b的值,这里就是常说的形参,用完后自定义函数会销毁但寄存器却不会,因此可以传值。以上是执行mian函数的反汇编,第一部分是给mian函数分配空间,创建好后才开始执行main中的函数。rsp和rbp是起保护作用,rsp和rbp中间的空间就是main函数的栈帧。栈区是由系统分配的内存,堆区是程序员自己动态分配的空间,静态区是全局变量存放的地方。而给mian函数分配的空间自然也就在栈区,又叫mian函数的栈帧。将rsp+4的地址赋值0,rsp+24的地址赋值0。

2024-03-24 17:28:42 157

原创 动态内存管理

4.在函数内部创建的空间会随着函数的结束从而销毁空间,虽然在函数内部成功创建了空间并return给了出去,但是空间已经销毁,销毁后得到是栈空间的地址。3.还有一个很重要的点,在使用构造的函数时,虽然给函数传递的是指针的名,但会在函数中会被认为是形参,必须要&(取地址)传递的才是实参,即使指针名的类型是int*之类带着*的。即使str是char*类型,并且传入后用p接收并开辟了空间,后用strcpy函数复制字符串,但是,p是形参,是临时变量,在函数结束时就已然销毁,str依旧是NULL。

2024-03-22 20:33:21 1010

原创 联合和枚举

使用枚举成员时也是直接使用(相当于#define)如果不给初始化,默认值会从0开始。enum是枚举的声明, enum枚举成员中不需要类型,但每个成员后要跟(,)逗号。联合体和结构体类似,也有多个成员构成,但编译器只为最大的成员分配足够的空间。联合体最大的特点是所有的成员共用同一块内存空间。另外,修改枚举成员的值只能初始化时修改。初始化后,后面的成员也会跟着初始化走。枚举就是一一列举,把可能值一一列举。

2024-03-19 21:24:32 278

原创 深度解析结构体

s2,struct s1 s的最大对齐数为8(条件4),占16,int i 对齐数为4,满足倍数关系,16+4 =20,char c1, char c2对齐数均为1,20+2 = 22,又根据条件3,最大对齐数为8,最小倍数大小24。略微修改s1和s2,s1中,char c1占1,int i 对齐数为4,故从4开始,4+4 = 8, double c2 对齐数为8,可从8开始,8+8 = 16,满足条件3,16是8的倍数,故内存大小为16。最大对齐数为4,最小整数倍为12。//按照结构体成员顺序初始化。

2024-03-17 21:24:50 479

原创 fgets()与fputs()函数

fgets() 函数会从指定的文件流中读取数据,直到达到指定的字符数、换行符或文件结束符为止,并将数据存储在 str 指向的字符数组中,同时在末尾添加空字符 '\0'。fputs() 函数会将字符串 str 输出到指定的文件流中,直到遇到空字符 '\0'。函数来将换行符从输入缓冲区中消耗掉,确保后续的输入函数能够正确工作。这样可以有效地清除输入缓冲区中的换行符,使得后续的输入操作不受影响。)读取并误以为是用户输入的内容,从而导致程序出现意外的行为。的作用就是消耗掉输入缓冲区中的换行符,以确保后续的。

2024-03-17 20:09:52 478

原创 针对二进制储存方式深度解析

整形指针+1跳过四个字节,((int)a + 1)强制类型转换为整形数字了,这里的(int)a + 1就是数字+1,(int*)((int)a + 1);在这里为什么a的值是-1 -2 -3 ···-128 127 126 125 ···6 5 4 3 2 1 0 -1···printf("*pfloat的值:%f\n", *pfloat);printf("*pfloat的值:%f\n", *pfloat);printf("n的值为:%d\n", n);printf("n的值:%d\n", n);

2024-03-13 10:57:25 736 1

原创 整数和浮点数在内存中储存的形式

以0.5为例,二进制形式为0.1,由于正数部分必须为1, 表示为1.0*2^-1,E = -1,储存时为(-1)+127 = 126。对于双精度浮点数,它使用64位来表示一个浮点数,按照如下格式进行存储: 1位:符号位(0代表正数,1代表负数) 11位:指数部分 52位:尾数部分。对于单精度浮点数,它使用32位来表示一个浮点数,按照如下格式进行存储: 1位:符号位(0代表正数,1代表负数) 8位:指数部分 23位:尾数部分。符号位位于数值位最高位的那一位,分别用0和1表示,0表示正数,1表示负数。

2024-03-12 21:19:31 565

原创 内存函数:memcpy()memmove()memcpy()memset()memcmp()

是C标准库中的一个函数,用于将指定内存区域的一块字节数据设置为特定的值。是C标准库中的一个函数,用于比较两个内存区域的内容。该函数会按字节比较两个内存区域的内容,直到发现不同的字节或比较完所有字节为止。可以看到在内存中,当列为4时,arr的07就是一个字节,第17个字节arr1是05, arr2是07。memcmp函数与strcmp函数类似,但memcmp函数的比较是一个字节一个字节的比较。两者都是内存拷贝函数,但memcpy处理的是不同空间的内容,即目标空间与源空间不同。

2024-03-11 21:33:18 2360

原创 字符串函数 strlen strcpy strcat strcmp strstr strtok strerror

dest++ = *src++,虽然++的优先级比*的优先级高,但后置++,先使地址解引用,得到dest和src的内容,后*dest = *src,最后才是地址dest++,src++。strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串的位置。是 C 语言中的一个字符串追加函数,用于将一个字符串的一部分追加到另一个字符串的末尾。是一个 C 语言中的字符串库函数,用于将一个字符串(源字符串)追加到另一个字符串(目标字符串)的末尾。

2024-03-09 20:24:23 2161

原创 字符函数

这里用toupper函数一样实现了小写转大写的操作,用tolower函数完成了大写转小写的操作。专门做字符分类的函数,都包含一个头文件#include <ctype.h>或者一个表示真的值(比如非零值);是一个函数,用于将一个字符转换为小写字母形式。是一个函数,用于将一个字符转换为大写字母形式。是一个用于判断字符是否为小写字母的函数。通常情况下,如果一个字符是小写字母,则。或者一个表示假的值(比如0)

2024-03-07 20:44:01 209

原创 C语言指针篇

指针数组,模拟二维指针-CSDN博客字符指针,常量字符串-CSDN博客二维数组传参-CSDN博客函数指针-CSDN博客函数指针数组(转移表)-CSDN博客回调函数-CSDN博客qsort函数(任意类型数据排序)-CSDN博客qsort函数 结构体比较(strcmp函数(比较字符串的大小))-CSDN博客qsort函数的模拟实现(冒泡排序模拟)-CSDN博客深入sizeof与strlen-CSDN博客指针运算笔试题解析-CSDN博客

2024-03-06 16:03:23 1075

原创 指针运算笔试题解析

/可看作*(*(cpp - 1) - 1) + 1,cpp指向c+1未变,cpp-1指向c+2,*后-1指向"NEW",再*后,指向首元素地址+1,打印EW。aa数组名表示首元素地址,二维数组首元素是一维数组,故aa表示第一行一维数组地址,aa+1指向第二行一维数组地址*(aa+1)表示aa[1],(int*)(*(aa + 1))强制类型转换后,(ptr2 - 1)指向5。

2024-03-06 15:55:42 983 1

原创 深入sizeof与strlen

sizeof不挑类型 strlen是指针且针对字符串,strlen 原型是size_t strlen(const char *str);

2024-03-02 21:34:33 925 1

原创 qsort函数的模拟实现(冒泡排序模拟)

base为void* 类型,强制类型转换为char类型,char类型长度为1字节(我喜欢叫它手术刀),这里传递的一个元素的长度length就很关键,每次跳过一个char*length长度(一个元素长度)这样就可以接收任意长度的元素了。比如传递的是int类型的,length就是4,char*p1与char*p2隔着四个字节,两两互换就可以实现两个元素的交换。关键在if比较这里,cmp为回调函数(比较大小的函数0 ),回调函数中的两个参数很重要。经过一轮遍历后,最大(或最小)的元素会排在最后。

2024-03-02 17:26:17 964 1

原创 qsort函数 结构体比较(strcmp函数(比较字符串的大小))

strcmp函数:strcmp是C语言标准库中的一个函数,用于比较两个字符串。它会逐个字符比较两个字符串,直到遇到不同的字符或者其中一个字符串结束为止。函数的返回值为整数,如果字符串相等则返回0,如果第一个字符串小于第二个字符串则返回负值,如果第一个字符串大于第二个字符串则返回正值。与长短无关,比较字母的大小例如avc与abcdef,这里avc就大于abcdef,因为第二位v大于b。在创建函数指针cmp_stu_age后,进行年龄大小比较,强制类型转换成stu*。运行出的值为1,又Z的ascll值大于L。

2024-03-01 20:03:48 336 1

原创 qsort函数(任意类型数据排序)

int (*compar)(const void*p1, const void*p2),返回值是int 类型,返回值是一个整形,函数指针会根据返回值 >0 ==0

2024-03-01 11:02:11 205

原创 回调函数

void calc(int(*pf)(int, int))为回调函数。通过函数指针调用的函数。

2024-02-28 21:11:49 756

原创 函数指针数组(转移表)

整合了加减乘除四种函数功能。arr先与[ ]结合称数组,故函数指针数组 例void(*arr[])(int, int)。在函数指针的基础上arr后加[ ]。函数指针 例void (*arr)(int,int)。是函数指针数组的一种体现,可由转移表实现不同函数。指针数组 例int* arr[ ]

2024-02-28 20:54:15 220

原创 typedef

int(*)(int, int )重命名成prr_t。将unsigned int 类型重命名成uint。数组指针 函数指针中typedef重命名在*后。int(*)[5]重命名成pr_t。

2024-02-28 10:12:04 81

原创 函数指针

故可将(*pf)(a, b )简化成pf(a , b )。函数名就是该函数的地址,无论是打印&add还是add结果一样。函数有地址,故可用函数指针变量储存函数的地址。

2024-02-28 09:18:20 205

原创 二维数组传参

将数组地址写成指针形式(*arr)[3]打印也可写成 *(*(arr+i)+j)二维数组传参传递的是数组首地址,数组首地址是一维数组地址。这里arr的首地址是{1,2,3}

2024-02-28 08:55:23 190

原创 数组指针。

打印时要写成(*p)形式,避免*先与方块结合。也不能写成*(p+i) 形式,p为数组整个地址。&arr取出的是数组整个地址。&arr[0]与arr相同,是数组首地址。int(*p)[5]和&arr的类型均为int(*)[5]数组指针:*先与数组名结合,后与方块结合。一般在二维数组中使用数组指针。指针数组:*先与方块结合。

2024-02-27 13:23:20 168

原创 %后加的字母

f 打印float浮点数据。%d 打印整型十进制数据。%c 打印字符格式数据。%p 打印地址数据。

2024-02-27 13:12:04 575

原创 字符指针,常量字符串

字符串还可以认为是字符数组,可以用数组形式来表达。常量字符串还可以出现在表达式中,为首字符的地址。内容相同的常量字符串只会保存一份。const限制字符串被修改。字符指针存放首字符地址。

2024-02-27 11:16:19 183

原创 指针数组,模拟二维指针

arr为数组首地址,地址后移再解引用等于此地址内容。

2024-02-27 10:40:18 145

原创 常量字符串(const)

const char * str是常量字符串,如果已有相同内容str3,则写入相同内容的str4是不会再开辟新的空间了,因为常量已创建。数组名就是地址,str1与str2是两个不同的数组,虽然内容相同,但是地址不同,故为no。

2023-11-22 19:01:52 94

原创 const修饰

const放在*p的左端限制*p,即不能通过修改指针变量(*p)的值来修改p指向空间的内容,但p不受限制。const放在*的右端限制p,即不能修改p变量,但*p不受限制。const 起保护作用,禁止修改。

2023-11-22 18:46:42 27

原创 模拟二维数组与指针

记住写arr时要加*,表明arr时一个指针数组。储存指针的数组叫指针数组。还可以写成二维指针的形式*(*(arr+i)+j)指针储存地址,不然就出现报错。

2023-11-22 17:02:29 25

原创 二级指针

打印,printf中**pp的表示:pp中储存的是p的地址,第一个*解引用地址p表示p的内容,p的内容为a的地址,第二个*解引用a的地址,表示a的内容。int*为p的类型。故pp第一个*表示pp为指针int** pp,指向p的二级指针。p中储存a的地址,pp中储存p的地址。

2023-11-22 16:43:52 26

原创 C语言陷阱与缺陷1

i的地址与arr末地址重叠,相同了。

2023-11-22 15:41:32 42 1

原创 字符与数字之间的转换

因为字符与数字都是ascll码值存储,故可相互转换。字符之间相减得数字,数字转字符只需加回字符即可。

2023-11-22 15:29:58 49 1

原创 static与extern

局部变量,临时变量和形式参数存放在内存的栈区,动态内存分配存放在堆区,全局变量和静态变量存放在静态区。局部变量经static修饰后具有全局变量的一部分性质了,从栈区跳到了静态区。若在文件中对变量进行static修饰,则该变量只能在自己的文件中使用。静态区的生命周期与main函数生命周期一致即程序生命周期。extern声明,用来声明外部符号。static修饰全局变量与局部变量。

2023-11-22 14:56:42 37 1

空空如也

空空如也

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

TA关注的人

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