- 博客(126)
- 收藏
- 关注
原创 58.【C语言】内存函数(memcpy函数)
为了避免溢出,由destination和source指针指向的数组应该至少为num个字节,而且两者不能重叠(对于。欲将arr[0]~arr[4]的内容复制到arr[2]~arr[6]中,以下代码是否能成功执行?void*类型的函数返回一个指向某种类型(任意类型,不需要强制类型转换)的指针。):指向要被复制的源的数据,类型转换至一个const void*类型的指针。因为destination和source的类型为void*,没有限制)):指向内容需要复制的目标数组,类型转换至一个void*类型的指针。
2024-09-20 10:57:59 566
原创 57.【C语言】字符函数和字符串函数(strerror函数)
翻译:函数错误码解释errnum的值,产生一条描述错误情况的信息的字符串,就像被库函数设置为errno一样这个返回的指针指向一个静态的已分配的且不能被程序修改的字符串,进一步调用此函数可能会覆盖内容(不需要特定的库的实施,避免数据竞争)strerror产生的错误信息的字符串可能特定于每个系统和库实现errnum:错误码一个指向用于描述错误码的错误信息字符串的指针简明扼要:strerror的作用:把错误码翻译成错误信息。
2024-09-18 16:08:16 419
原创 56.【C语言】字符函数和字符串函数(strtok函数)(未完)
• strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串。• strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标。记,执行后,copy数组变为user\0csdn\0net ,返回的指针p指向第二个\0。执行后,copy数组变为user\0csdn.net ,返回的指针p指向这个\0。执行后,不存在更多的标记,则返回NULL 指针,因此打印(null)
2024-09-18 13:54:09 701
原创 55.【C语言】字符函数和字符串函数(strstr函数)
翻译:函数或另一个版本返回指向第一次出现在字符串1里的字符串2的指针(即出现的位置),如果字符串1里没有字符串2,返回空指针这个匹配过程并不包括\0,但到此为止str1:要扫描的字符串str2:含要匹配的字符序列的字符串返回一个首次出现在字符串1里的字符串2的完整序列的指针,如果找不到字符序列,那么返回一个空指针在C语言中,该函数只能这样声明而不像在C++中有两种重载版本如果改成找不到返回空指针。
2024-09-17 13:06:13 394
原创 54.【C语言】 字符函数和字符串函数(strncpy,strncat,strncmp函数)
和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数。
2024-09-16 19:32:20 1191
原创 汇编实现从1加到1000(《X86汇编语言 从实模式到保护模式(第2版》) 第135页第2题解答)
编写一段主引导扇区程序,计算从1加到1000的和,并在屏幕上显示结果。2.s3循环中,一定是保存完dx后再为dx清零。具体怎么将bin文件写入主引导扇区见此文。,否则新写入的数据会被覆盖!
2024-09-14 12:00:48 586
原创 52.【C语言】 字符函数和字符串函数(strcat函数)
1.格式:2.stcpy从目标空间的第一个\0开始追加,并且覆盖掉\03.追加的字符串stcat以第一个\0为结束标志,停止追加4.自己不能给自己追加。
2024-09-13 13:46:49 1009
原创 MCU9.reg52.h的介绍
区别:优先搜索的位置不同!在keil软件中优先搜索软件安装的INC文件夹优先搜索当前工程文件夹下的头文件,如果没有,则在软件安装的INC文件夹下搜索头文件。
2024-09-11 09:20:03 428
原创 E32.【C语言 】练习:蓝桥杯题 懒羊羊字符串
现在,给定几个字符串 s1,s2,...,sn,每个字符串均由三个大写字母组成。请你统计其中有多少个字符串符合“懒羊羊”字符串的定义。第一行输入一个整数 n (1 < n ≤ 200),表示字符串的数量。接下来的 n 行,每行输入一个由三个大写字母组成的字符串,换句话说,“懒羊羊”字符串的形式应为 ABB,其中A和B是不同的字母。符合“懒羊羊”字符串定义的字符串只有 “STT”,因此答案为 1。输出一个整数,表示符合“懒羊羊”字符串定义的字符串总数。存储字符串就是将一个个的字符存储到一个个元素中。
2024-09-10 14:49:32 848
原创 MCU7.keil中build产生的hex文件解读
闲来无事,查看了的hex文件用FlexHex打开给我的第一印象是:经过软件的解释之后,发现这些数据排列地把解释后的数据当作十六进制来观察1.每一行数据均以冒号:开头2.行与行之间的数据长度不同看每行第1,2个数字02H(十六进制)=02D(十进制),03H=03D,0CH=12D,00H=00D第1行比第2行少1个字节(03D-02D=第2行比第3行少9个字节(12D-03D=第4行比第1行少2个字节(02D-00D=发现两行数据的长度的差值恰好对应两行的第1,2个数字相减的值。
2024-09-09 10:52:49 588
原创 MCU5.51单片机的最小系统
晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序)烧录:通过下载电路,把程序下载到单片机中用于运行。
2024-09-07 17:45:43 449
原创 MCU4.逻辑门电路的符号
C语言符号:&(按位与)和&&(逻辑与)逻辑门电路的符号:符号:|(按位或)和||(逻辑或)逻辑门电路的符号:C语言符号:!(按位非)逻辑门电路的符号:相同为真(0⊙0=1,1⊙1=1),否则为假(0⊙1=0,1⊙0=0)符号:⊙(按位同或)图片:C语言符号:⊕(按位异或)逻辑门电路的符号:之前C语言的专栏讲过,0为假非0为真,对应在数字电路中,0代表逻辑电平0(低电平),1代表逻辑电平1(高电平)
2024-09-07 16:45:53 289
原创 汇编语言在虚拟机中输出“Hello World!”
02.编译后的bin文件用Fixvhdw64.exe。Nasmide64.exe(李忠老师编写)Fixvhdw64.exe(李忠老师编写)VirtualBox虚拟机(免费 开源)注意vhd文件大小一定设置成固定的。
2024-09-05 17:53:15 494
原创 E32.【C语言】练习:指针运算习题集(下)(未完)
求下列代码的执行结果答案速查:分析:这条代码不是把三个字符串放入a中,而是a指针数组中存放着的地址指向字符串的work首字母w的第一个字节,at首字母a的第一个字节alibaba首字母a的第一个字节VS2022打开内存输入&a发现存放的地址0x009a7bcc,0x009a7bd4,0x009a7bd8是连续的,对应三个字符串的首字母的地址转到地址0x009a7bcc每一个字符串的结尾都跟着\0pa的类型是char**,是二级指针(潜台词:二级指针指向一级指针。
2024-09-04 19:05:51 434 2
原创 49.【C语言】解释“数组和指针”容易混淆的地方
arr1的类型在int[5]的基础上加个*,即。上方代码运行是否有错误?写的内容是否规范呢?定义了一个名为arr1的数组,其类型为。定义了一个名为arr2的数组,其类型为。定义了一个名为arr4的数组,其类型为。编译器认为p2是数组其包含5个元素(从int(*)[5]推过来。
2024-09-03 10:33:19 471
原创 MarkDown 基础语法
轻量级标记语言,比word方便操作且语法简单,文件以md为后缀名常见于github.com仓库上的readme.md。
2024-09-02 17:37:03 541
原创 MCU3.电平等一些名词
计算机由各种硬件组成,只认识0和1,可以通过改变电压来向计算机输入数据(0和1)例如:最大电压为3.3V电压范围是0~3.3V,可以定义0~1V较低的电压表示0,定义2~3.3V较高的电压表示1现在定义:低电平(low level):0~1V 高电平(high level):2~3.3V如CPU要输出100这个十进制数字,其内部操作为:先把12345转换为二进制数,再把二进制数转换为一系列高低电平。
2024-09-01 16:22:22 285
原创 MCU2.认识51单片机开发板的各个模块
Analog-to-Digital Converter 模拟信号转数字信号。Digital-to-Analog Converter 数字信号转模拟信号。顾名思义,可以精确控制旋转角度的电机。是插针用于连接外部电路。
2024-09-01 14:56:20 316
原创 MCU1.51单片机介绍
2--表示该芯片内部程序存储(FLASH)空间大小,1 为4KB,2 为8KB,3 为2612KB,即该数乘以4KB 就是芯片内部的程序存储空间大小。一般来说,程序存储空间越大,芯片价格也越高,所以我们再选择芯片的时候要根据自己需求选择合适芯片。9--表示内部含有Flash EEPROM 存储器,还有如80C51 中0 表内部含有MaskROM(掩模ROM)存储器;40--表示芯片外部晶振最高可接入40MHz。I--工业级产品级别,表示芯片使用温度范围。8--表示该芯片为8051 内核芯片。
2024-08-31 18:10:59 1164
原创 ★♛★指针(重难点)合集
格式 数据类型指针变量名称=&变量名称;//指针变量:存放指针(地址)的变量指针常量:具体的地址 如0x00F85580(*不可以省略)这个*是解应用操作符,数据类型* 表示专门存储地址==专门存储指针,“数据类型*”称为指针变量的类型理解char*的含义:拆成两部分*:说明pch是指针变量char:说明pch指向的对象ch是char类型的所以建议命名指针变量的格式为“p+指针类型的首字母”3.介绍解引用操作符(*)只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象。
2024-08-29 14:59:18 918
原创 E30.【C语言】练习:sizeof和strlen的习题集(B)
arr[0]是取首元素的地址,+1第二个元素的地址,因此。p是一个指针变量,也就是求指针变量的存储空间,结果为4/8。&arr是取整个数组的地址,+1跳过整个数组,但仍然是。,结果为7(一个字符占一个字节)arr+0代表首元素的地址,因此。&arr是取整个数组的地址,因此。,又因为char类型,结果为1。arr[1]是第二个元素,因此。,又因为char类型,结果为1。4/8含义:4或8个字节。*arr是首元素,因此。x86环境:4个字节。x64环境:8个字节。
2024-08-29 10:56:40 469
原创 E29.【C语言】练习:sizeof和strlen的习题集(A)
细节部分:由strlen的声明和定义知,strlen接收的是const char* str,而arr代表char(*)[6],因此会发生强制类型转换。a+0代表数组的首元素地址+1,+1跳过4个字节,为第2个元素的地址,因此。注意这里的sizeof(a+0);a是数组名,是数组首元素的地址,*a解引用为数组首元素,因此。&a为取a的地址(整个数组的地址),地址+1还是地址,因此。&arr是数组的地址,也是数组开始位置的编号,strlen。arr是首元素的地址,+0还是首元素的地址,strlen。
2024-08-29 09:51:51 924
原创 48.【C语言】结构体补充
原因:结构体与一般的数组不一样,当结构体中的数组比较大时(int arr[9999] )在传值时会复制一份一样的int arr[9999],占用大量空间,降低效率;s为arr和n赋值,arr的前5个元素分别赋值为1,2,3,4,5,其余默认为0,n赋值为100。传参时function(int a)中int是变量类型,a是变量名。定义结构体S中的两个结构体成员,分别为arr整型数组和整型变量n。中int是变量类型,a是变量名,0是变量值。struct S s:S代表结构布局,s代表结构变量。
2024-08-27 20:29:36 784
原创 47.【C语言】指针(重难点)(J)
/由于数组的元素是连续排列的,因此需要知道每个元素具体占多少字节来访问每个元素,可以在base的基础上+j*width来移动,因此base是void*型,要强制类型转换为。> p1和p2为需要比较的两个元素,由于不知道元素是什么类型,因此写void*,又要确保稳定,用const修饰。元素1位置=base+j*width 元素2位置=base+(j+1)*width。> base指针存放第一个元素的地址,由于不知道元素是什么类型,因此写void*写过一个排序函数,可以将此自制一个类似qsort的函数。
2024-08-26 10:23:44 479
原创 46.【C语言】指针(重难点)(I)
时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。★2.void*类型的指针不能解引用操作符,也不能+/-整数的操作,这种指针变量一般是用来存放地址的,使用之前要。base:指向在需要被排序数组中的第一个元素,转换为void*型(即base存放第一个元素的地址)如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数。返回值
2024-08-24 10:33:04 1011
原创 45.5【C语言】typedef
signed long long被简写为k这个别名,之后可用k直接定义变量,简化输入。但用typedef将int*重定义为ptr后,p3和p4类型均为int*禁止写成typedef int(*)(int,int) ptr!禁止写成 typedef int(*)[10] ptr!改函数有两个类型均为int的参数,且返回类型也是int。由于int*中*优先结合p1,导致p1,p2的类型不同。把int(*)[10]数组指针简写为ptr。把int*指针类型简写为ptr。必须要求简化名称在*旁边。
2024-08-21 11:07:40 522
原创 45.【C语言】指针(重难点)(H)
的内容是int和void(*)(int),第一个参数是int,第二个参数是void(*)(int) 即函数指针类型(该指针指向的函数:返回void,参数int)在void(*)()前加*是解引用(调用0地址处的函数)最后在(*(void (*)())0)后加()表示无参可传(这个函数没有参数)……)0,括号内是void(*)()即函数指针类型,0作为函数的地址,这个函数没有参数,返回类型void。格式 函数的返回类型 (*指针变量的名称)(该函数的参数1,该函数的参数2,该函数的参数3。
2024-08-21 08:56:31 1321
原创 44.【C语言】指针(重难点)(G)
]的优先级要高于*号的,所以必须加上()来保证p先和*结合,表明p2是指向数组的指针变量(即数组指针变量),也就是定义p3的写法。显然p1是整型指针,p3是数组指针(指向含5个int元素的数组的指针),p4是数组指针(指向含5个int*指针的数组的指针)虽然两个数组的内容一样,但是abc字符串创建了两次,str1和str2存储的数组的首元素的地址不一样,所以not same。arr数组是一段连续的空间,数组的内容是可以变的,所以常量字符串(char* pc =*像数组一样指定访问常量字符串的字符。
2024-08-16 16:54:43 1305
原创 43.【C语言】指针(重难点)(F)
上方代码并没有创建二维数组,但是却依靠指针数组模拟出二维数组,可以按照二维数组的形式(arr[i][j])来访问。bc f8 8f 00 --倒着写-->00 8f f8 bc-->008ff8bc-->是&pa的结果。命名的含义:ppa-->point pa-->point (point pa)c8 f8 8f 00--倒着写-->00 8f f8 c8-->是&a的结果。01 00 00 00--倒着写-->00 00 00 01-->是变量a的值。n级指针是指向(存储)(n-1)级指针地址的指针。
2024-08-13 17:16:31 937
原创 42.【C语言】冒泡排序
回想标志寄存器(flag register)的概念:标志寄存器用于存储状态信息,这些状态信息可以。如 输入 9 0 1 2 3 4 5 6 7 8 一趟冒泡排序后就已经完成任务了,但。9+8+7+6+5+4+3+2+1=(1+9)*9/2=45步。输出:0 1 2 3 4 5 6 7 8 9。:有顺序时取消交换,提前退出循环,输出结果。对于上方的代码,当有10个元素时,来控制趟数(i)和步数(j)冒泡排序需要(N-1)步。冒泡排序需要(N-1)步。冒泡排序需要(N-2)步。冒泡排序需要(N-3)步。
2024-08-13 15:52:12 619 1
原创 41.【C语言之外】聊聊Cheat Engine官方教程步骤6的思考
如果你要关掉它,那么要记好方栝号中间的代码)并做一次 4 字节的扫描,扫描"详细信息"窗口中告诉你的一串十六进制数值。回到教程,点击"确定"这个地址便会加到 CE 主窗口下方的地址列表中,如果没做错,在地址栏将显示 P->xxxxxxxx,而 xxxxxxxx 和你扫描到的地址数值是一致的,如果不一致,那么可能是哪里出错了。"添加地址"窗口将发生变化,多出了"Address of Pointer(指针地址)"和"Offset (Hex)(偏移量(16进制))"的文本框,以便您键入一个指针的地址和偏移量。
2024-08-10 15:05:30 1196
原创 40.【C语言】指针(重难点)(E)
则有*(pi+i)==*(i+pi)==*(arr+i)==*(i+arr)==arr[i]==i[arr]==p[i]==i[p]一个大胆的猜想:arr[i]==i[arr],执行后结果正确(无论哪种写法都会转换为*(arr+i),[]只是操作符):sz2=sizeof(arr)/sizeof(arr[0]),sz2==1,即sizeof(arr)==1。1.sizeof(数组名):这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。总结:1.数组传参本质上是传递的是数组首元素的地址。
2024-08-10 10:49:37 786
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人