- 博客(70)
- 收藏
- 关注
原创 C语言笔记(28)柔性数组及文本相关知识
如有整数1000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配没并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。结论:因为有缓冲区的存在,C语言在操作文件时,需要做刷新缓冲区或在文件操作结束时关闭文件,若不做可能导致读写文件的问题。数据文件:文件的内容不一定是程序,二十程序运行时的读写的数据,比如程序运行需要从中读取数据的文件或者输出内容的文件。
2023-12-26 13:33:29
1001
原创 C语言笔记(27)动态内存管理等知识
有时我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的内存,我们一定会对内存的代下做灵活的调整。函数功能是为num个大小为size的元素开辟出一块空间,并且把空间的每一个字节初始化为0,与函数malloc的区别在于calloc会返回地址之前把申请的空间的每个字节初始化为0.返回值是void*,所以malloc函数并不知道,开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数ptr只想的空间不是动态开辟的,那free函数的行是未定义的。free函数用来释放动态开辟的内存。
2023-12-24 21:37:25
450
原创 C语言笔记(26)位段、枚举、联合等知识
联合:联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间,所以联合体也叫共用体。4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。1.位段空间上是按照需要以4个字节(int)或1个字节(char)的方式来开辟的。总结:跟结构相比,位段可以达到同样的效果,但可以很好节省空间,但有跨平台问题存在。2.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。如:struct A。
2023-12-24 20:24:44
429
原创 C语言笔记(25)结构体及相关知识
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处。结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。原因:函数传参是,参数是需要压栈,会有时间与空间上的系统开销,若传递一个结构体对象时,结构体过大,参数压栈系统开销较大,所以会导致性能下降。不是所有的硬件平台都能访问任何地址上的任意数据的,某些硬件平台只是在某写地址处取得某些特定数据类据,否则抛出硬件异常。原因在于,为了访问对齐的内存,处理器需要做两次内存访问,而对齐的内存访问仅需要一次访问。
2023-12-23 22:36:34
415
原创 C语言笔记(24)字符分类函数及相关零碎知识
\f’ 换行'\n',回车'\r',制表符'\t',或垂直制表符'\v'memcpy函数时不用来处理重叠的内存之间的数据拷贝的,可以使用memmove函数来实现。isprint 任何可打印字符,包括图形字符与空白字符。isxdigit 十六进制,包括所有10进制,小写大写a~F。isalnum 字母/数字,a~z, A~Z, 0~9。isalpha 字母a~z/A~Z。ispunct 标点符号。结果:××××× zhang。
2023-12-23 13:56:31
334
原创 C语言笔记(23)冒泡排序与strcopy等知识
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是有该函数的实现方直接调用,而是在特定的事情或条件发生时有另外的一方调用的,用于对该事件或条件进行相应。strlen可以求字符串长度,因为遇到“\0”就会停止,但不可以用来求字符,因为字符没有“\0”作为结束标志,strlen不会停止,存的是随机值。//void*时无具体类型的指针,所以不能解引用操作,也不能±整数。//name数组名是地址,地址是一个常量值,不能被赋值。
2023-12-22 22:14:20
370
原创 C语言笔记(22)二维数组和一些零碎知识
该函数指针指向的函数参数是int,返回类型是void,signal函数返回类型也是一个函数指针,该函数指针指向的函数参数是int,返回类型是void。以上代码是一次函数申明声明,声明的signal函数第一个参数类型是int,第二个参数类型是函数指针。p是指向数组的,*p其实就相当于数组名,有是数组首元素的地址。2.&数组名,这里的数组名表示的依然是整个数组所以数组名去除的是整个数组的地址。函数也是有地址的,对于函数来说,&函数名和函数名都是函数的地址。理解一个代码 (*(void(*)())0)()
2023-12-20 19:54:05
426
原创 C语言笔记(21)零碎知识
若出现负数,存入内存时E的真实值必须加上一个中间数,对于8位的E,这个中间数时127;E为无符号整数,若为8位,它的取值范围是0~255;int* p[10] 与 int(*p)[10]因为赋给指针的是值,只可以比较,后这是两个不同空间的数组,不可以进行比较。double->E(真实值) +1023(中间值)——>1022。每个元素是指针 *p必须指向的是数组,int类型。float->E(真实值)+127(中间值)——>126存储。//存放整型指针的数组。
2023-12-18 20:39:12
457
原创 C语言笔记(20)零碎知识
对于整形来说:数据存放内存中其实存放的是补码,原因是在计算机系统中,数据一律用补码来表示和存储。(CPU只有加法器),此外,补码与源码相互转换,其运算过程是相同的,不需要额外的硬件电路。把一个数据的高位字节序的内容存放在低地址处,把低位字节序内容存放在低地址处,把低位字节序内容存放在高地址处,就是大端字节序存储。1.栈区内存的使用习惯是先使用高地址的空间,在使用低地址的空间。p指向的对象是可以通过p来改变的,但是不饿能修改p变量本身的值。p指向的对象不能通过p来改变,但是p变量本身的值是可以改变的。
2023-12-10 22:09:11
395
原创 C语言笔记(19)算法和调试相关知识
调试,又称除错,时发现和减少怕计算机程序或电子设备中程序错误的过程,Debug通常称为调试版本,包含调试信息,并且不做任何优化,便于程序员调试程序。因为i是有符号类型,sizeof是无符号类型,当有符号类型负数被转化为无符号类型正数会变成很大的无符号类型正数。release称为发布版本,它往往进行了各种优化,是程序在代码大小和运行速度上都是最优的,方便用户很好使用。p指向的对象是可以通过p来改变的,但是不能修改p变量本身的值。p指向的对象不能通过p来改变,但p变量本身的值是可以改变的。
2023-11-01 14:46:31
74
原创 依次输出倒置之后的字符串,以空格分割。实例输入:i like beijing.输出:beijing . like i
【代码】依次输出倒置之后的字符串,以空格分割。实例输入:i like beijing.输出:beijing . like i。
2023-10-31 10:49:59
98
原创 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少瓶?
【代码】喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少瓶?
2023-10-30 20:53:09
61
原创 求Sn = 2+22+222+2222+...+22222... 求一个数字的前n项和
【代码】求Sn = 2+22+222+2222+...+22222... 求一个数字的前n项和。
2023-10-30 13:37:19
192
原创 KK想获得某年某月有多少天,请帮他编程实现,出入年份和月份,计算这一年这个月有多少天
/针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。//多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
2023-10-30 10:31:39
122
原创 两个int(32位)整数m和n的二进制表达式中,有多少个位(bit)不同?
F2:算n & (n - 1) = 0进行了几次,0可以作为循环判断条件。
2023-10-29 21:45:53
67
原创 KK想判断输入的字符是不是字母,请帮他编程实现
/针对每组输入,输出单独占一行,判断输入字符是否为字母,输出内容。//多组输入,每一行输入一个字符。
2023-10-29 20:14:21
54
原创 KK想完成字母大小写转换,有一个字符,判断它是否为大写字母,如果是,将它转化为小写字母;反之则转化为大写字母。
思路:大小写字母之间asc码都相差32,只有26个字母。//针对每组输入,输出单独占一行,输出字母的对应形式。F2:利用scanf返回值为0进行循环判断。//多组输入,每一行输入一个字母。
2023-10-29 14:38:55
143
原创 最高分与最低分之差输入n个成绩,换行输出n个成绩中最高分数和最低分数只差
/问题在于arr初始创建的数组大小是多少就是多少,不会由n决定,比如arr[10],但n=5。//输入成绩时arr[i]中存入的数据是:{99,98,97,95,91,0,0,0,0,0}//所以输出的时候要格外注意,不能用首位减去末尾。//这种方法跟冒泡排序最大不同处在于不用考虑数组大小,因为能直接找出来最大值和 最小值。第二行为n个成绩(整数表示,范围为0~100),以空格隔开。两行,第一行为n,表示n个成绩,不会大于10000.一行,输出n个成绩中最后高分和最低分数的差。
2023-10-29 11:05:29
212
原创 有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出。删除指定数字之后的序列,序列中为被删除数字的前后位置没有发生改变。//数据范围:序列长度和序列中的值满足1<=n<=50
【代码】有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出。删除指定数字之后的序列,序列中为被删除数字的前后位置没有发生改变。//数据范围:序列长度和序列中的值满足1<=n<=50。
2023-10-29 09:22:03
123
原创 小乐乐上课需要走n阶台阶,因为他的腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?(递归法求解)
当n在增加时,走法就很多了。此时我们假设test(10)是n=10时的10个台阶所有走法,但乐乐一次只能走1阶或者2阶,走1阶时,还剩9阶,那不就是走1阶:test(9)种走法么;也就是当n>2时,test(n) = test(n-1) +test(n-2);不就是2阶:test(8)种走法;两个数相加不就是10阶的走法;当n很小时,n = 1时,有一种走法;n = 2时,有2种走法。
2023-10-28 22:34:14
144
原创 编写代码实现:求一个整数存储在内存中的二进制中1的个数
一直&下去可以算出i=0;循环条件是在32位范围之内要注意。//F1: i%2 i/2法。//F3:移位&1法。
2023-10-28 21:29:53
57
原创 创建一个整形数组,完成对数组的操作:实现函数intit()初始化数组全为0;实现print()打印数组的每个元素;实现reverse()函数完成数组元素的逆置
注意:逆序和初始化不可以同时进行,必须屏蔽掉其中一个运行另一个。这里必须传指针直接通过地址改变变量的值,不能用简单的变量。
2023-10-28 20:12:30
289
原创 //写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和//例如调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
【代码】//写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和//例如调用DigitSum(1729),则应该返回1+7+2+9,它的和是19。
2023-10-28 07:56:04
60
原创 字符串逆序(递归实现)
abcdefg,此递归法先将字符串赋给一个变量tmp,再交换a和g,然后在g的位置放入'\0',这样bcdef\0就成了新的字符串,在进入新的递归,最终将tmp中的a存到原来g的位置。另一方面字符串结尾有'\0',所以有8个字符,算right下角标时比原来少2;跟F2最大的不同之处在于,此递归法直接将字符存到数组中该交换的位置,直接在主函数中打印字符串就行了/运行abcdef 打印a(但运行bcdef优先级比打印a高,所以先进行下次递归)\0此时开始打印f,然后回归到ef的程序,打印e以此类推。
2023-10-27 17:09:23
479
原创 冒泡排序:把数组排成升序
第一次写给了butter一个int没注意,结果打印出来还是原来乱序的,原因是int声明下给test直接开辟出了空间,test整体上跟变量性质差不多,结果也会存到test里边。另外flag只是用来加快运行速度的。
2023-10-27 16:44:41
148
原创 编写程序数一下1到100的所有整数中出现多少个数字9
还有不能用if()...else if()语句,这两个语句是并列语句,也是一个表达式如果在if()语句中成功运行直接跳过else if()语句,只能用两条独立的if()语句,这样99执行完第一个还要进入第二个执行。这道题要特别注意99有两个9,算作2次。所以执行两个条件不能用||,(i/10 == 9)||(i%10==9)表示只要99在一个表达式里成功运行,直接产生结果,不会再进入下一个运行了。//99算两个数字9。
2023-10-27 09:35:18
184
原创 给定两个数,求这两个数的最大公约数
刚开始我想着顺序下打印最后一个元素,但sz求得不对,原因是赋给arr的N是宏定义,根本没在内存中开辟空间,所以sz求不出来。原始思路:我想着把所有公约数算出来后,把这些公约数放到数组中,因为是顺序,所以数组中的元素也是顺序放的,然后把数组逆过来打印第一个元素就可以了,但可惜数组在层层循环中调不出来。while(c=a%b),当c!=0时,也就是c非0,条件为真,继续循环。直到c=0,条件为假循环停止,输出。=0时,把b的值给a,把c的值递给b,再用a%b算出新c,直到c=0时b就是最大公约数。
2023-10-26 22:35:18
50
原创 输入三个随机整数从大到小输出
要着重注意的是swap传递的是地址而非把变量值传过去,因为把变量值传过去,交换的也只是x和y的值,并没有交换a和b的值,除非x和y这个值能重新传递过来,但要知道return是只能传回来一个变量的。即将内存 1 中的值拷贝到内存 2 中。拷贝传递的结果是:不管如何改变内存 2 中的值,对内存 1 中的值都没有任何影响,因为它们两个是不同的内存空间。这个写法就是很平常的变量交换,此写法的思路是根据结果推导过程,确定打印a b c就说明a肯定是最大的,然后开始给条件就行了。- 不需要改变它的值,只是使用它的值。
2023-10-26 20:32:50
119
原创 模拟实现strlen ,(不创建临时变量)计算字符长度(递归法)
这就是递归法的精髓,把一个复杂的问题拆分成一个个小问题,然后逐个解决。//这个1求出的是每个字符的长度。2.不创建变量的递归写法。
2023-10-26 16:23:50
53
原创 接受一个整型值(无符号), 按照顺序打印它的每一位.例如:输入:1234, 输出: 1 2 3 4.
当n = 1不满足条件时,执行下一步printf(),1被打印出来。但整体上第四次循环是在第三次if()循环中进行的,第四次彻底结束意味着第三次if循环结束,该执行第三次循环的printf()了,此时n=12,那被打印的就是2,以此类推。创建数组要用宏定义#define N 10,宏定义不会给数组创建内存,常规定义会创建内存,编译过不去。假如n=1234,进入print()函数中,会先执行if(1),在执行printf()然后n =123进入print(),再执行if, printf()
2023-10-25 22:52:31
196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人