- 博客(51)
- 收藏
- 关注
原创 C语言 ——— 浮点数类型 在 内存中 的 存储模式
任意一个表示的是的当时,,此时的就表示为当时,,此时的就表示为表示,且表示的的转换为转换为为:转换成;;
2024-07-15 23:55:15
672
原创 C语言 ——— 大/小端存储模式的介绍及判断
那么 char*类型 的 指针变量pa 解引用后只能访问到 一个字节,也就是只能访问到首地址(低地址)将 变量a的首地址(低地址) 取出来,存放在 char*类型的 指针变量pa 中。所以只需要判断 指针变量pa 解引用后的值。数据以字节为单位,从而讨论的存储顺序。值为1时:此机器就是小端存储模式。值为0时:此机器就是大端存储模式。的数据在内存中存储占。的数据在内存中存储占。此时就能更直观的看到。
2024-07-15 18:12:59
704
原创 C语言 ——— 将一句英语短句中的单词进行倒置
输入:"I like chongqing very much,"输出:"much, very chongqing like I"将一句英语短句中的单词进行倒置,标点符号不倒置。重复找空格,最后完成所有单词的逆置。指向下一个单词的首地址,利用外部。先逆置整个字符串,再逆置各个单词。封装一个逆置函数,用来逆置。找空格,找到空格后利用。
2024-07-14 21:31:32
459
原创 C语言 ——— 输入两个正整数,求出最小公倍数
当输入的两个正整数接近了整型能表示的最大范围时,那么这两个正整数的最小公倍数一定会超出整型能表示的最大范围。最小公倍数是指两个或者多个正整数(除了0以外)的最小的公共倍数。如:输入:5 7。就自增1,直到能同时取模为 0 为止。的结果同时为 0 时,那么此时的。如果取模结果不为 0 时,那么。,如果结果为 0 ,那就说明。如果结果不为 0 时,递增。
2024-07-14 19:03:44
338
原创 C语言 ——— const关键字
当修饰的后,此时的就具有长属性,就不能被赋值为其他的值将存储到中,通过改变的值但是加上修饰就是为了不能改变的值,所以要再用修饰再次加上修饰后,就不能被修改为其他的值可以修饰。
2024-07-12 22:29:37
1970
原创 C语言 ——— 调试的时候如何查看当前程序的变量信息
在开始调试后点开:调试 -> 窗口 -> 内存,内存的1、2、3、4都可使用。在调试后点开:调试 -> 窗口 -> 监视,监视的1、2、3、4都可使用。在内存中的地址处输入 arr1,因为 数组名arr1 就是首元素的地址。调试前的调试窗口是没有显示的,只有在调试的时候才会有相对应的调试窗口。输入后回车,然后就能查看 arr1 这个数组所占内存的布局。在开始调试后点开:调试 -> 窗口 -> 调用堆栈。最后再从上往下还给操作系统,回到main函数。函数在调用时就像堆一样从下往上堆叠。
2024-07-11 21:34:18
412
原创 C语言 ——— 实用调试技巧(Visual Studio)
断点设置为 i == 2 ,此时 F5 运行时,会直接运行到当i == 2时的逻辑,且断点前的代码已经运行完毕。,它进行了各种优化,使得程序载代码大小和运行速度上都是最优的,以便于用户很好的使用。当调试箭头指向函数调用时按下F11,会进入函数内部,能观察到函数内部的细节。当调试箭头指向函数调用时按下F10,会直接走过函数,并完成函数中的代码。时调试箭头就会直接指向断点处,且断点处以上的代码已经执行完毕。,它包含调试信息,并且不作任何优化,便于程序员调试程序。内部的条件语句或者判断语句,使用。
2024-07-11 18:42:03
516
原创 C语言 ——— 写一个函数,返回参数二进制中 1 的个数
输入一个整数n,输出该数32位二进制中为1的个数(包括最高位的符号位),其中负数用补码表示如:输入:15 (15的二进制表示:0000 1111)输出:4。
2024-07-08 18:46:02
199
原创 C语言 ——— 指针数组 & 指针数组模拟二维整型数组
printf("%s\n", *(parr + i)):每个元素解引用后就是各个一维数组的数组名,再通过%s的形式打印每个元素的内容。*parr:parr解引用,就能拿到parr这个指针数组的首元素,也就是arr1。解析:printf("%s\n", *(parr + i));整个数组的总大小除以数组一个元素的大小就等于数组元素个数。指针数组 --- 存放指针变量(存放地址)的数组。由以上的类型可以推断出……整型数组 --- 存放整型变量的数组。字符数组 --- 存放字符变量的数组。
2024-07-06 23:16:35
313
原创 C语言 ——— 一级指针 & 二级指针
把int**拆开理解:int* 是在说明 ppa 指向的是int*类型的变量,第二个 * 是在说明 ppa 是指针变量。二级指针变量解引用一次,找到的是一级指针变量pa,所以可以替换原式 *ppa 等价于 pa。由以上监视可以看出pa存放的是a的地址,取地址pa取出的是pa这个指针变量的地址。那么就需要二级指针变量来存储一级指针变量的地址。* 是在说明pa是指针变量,int是在说明 pa 指向的对象的类型是int。ppa就是二级指针变量,二级指针变量就是用来存放一级指针变量的地址的。
2024-07-06 21:38:33
443
原创 C语言 ——— 野指针的概念 & 如果规避野指针
数组的长度为10,那么数组的下标为0~9,但用指针变量pa来操作数组时超出了数组的范围,这时的pa就是野指针,且程序会报错,直接终止运行。int类型的变量a的空间是进入test()函数创建,出test()函数时销毁(还给操作系统)但a已经被销毁了,所以再使用p访问a的空间时就会存在非法访问,此时的p就是野指针。但是在销毁前将a的地址返回给同类型的指针变量p中,p此时存放的就是a的地址。局部指针变量未初始化,默认为随机值,且程序会报错。能明确知道指针该初始化为谁的地址时,就直接初始化。
2024-07-05 22:02:34
260
原创 C语言 ——— 指针和指针类型
因为pa是int*类型的指针变量,加一表示向后跳过自身长度的一,所以向后跳了4个字节的长度,00AFF850 - 00AFF84C = 4。那既然指针变量的大小在32位/64位平台下都是4/8个字节,那为什么不同类型数据的地址要用不同类型的指针变量接收呢?因为pa是char*类型的指针变量,所以加一向后跳了1个字节,00AFF84D - 00AFF84C = 1。因为指针变量 pa 和 pc 都是存储的a的首地址,所以打印pa和pc是相同的。把int类型的a的地址取出来,存放入同类型的指针变量pa中。
2024-07-05 14:42:11
252
原创 C语言 ——— 隐式类型转换 & 算术转换
所以 char类型的a 和 short类型的b 就会发生整型提升,a和b的最高位都是1,所以整型提升后的结果就会发生改变,自然判断就不会全等。当 if (a == 0xb6) 和 if(b==0xb600) 比较判断时,就会发生算术运算,那么就必然会发生整型提升。正和负表示算术运算,只要cher类型和short类型的数据参与运算,就会发生整型提升,提升为int类型,所以。表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度。
2024-07-02 23:23:21
992
原创 C语言 ——— 下标引用操作符;函数调用操作符;结构成员访问操作符
算数操作符(除法操作符和取模操作符)-CSDN博客移位操作符-CSDN博客按位与、或、异或操作符-CSDN博客单目操作符-CSDN博客逻辑操作符-CSDN博客条件操作符(三目操作符);逗号表达式-CSDN博客。
2024-07-02 19:02:46
333
原创 C语言 ——— 条件操作符(三目操作符);逗号表达式
a大于b吗,a大于b的话a就是整个表达式的结果,a小于b的话b就是整个表达式的结果。a = b + 10:b初始值为2,2+10的结果赋值给a,a的值就被赋值为12。b = a + 1:a被赋值为12,12+1的结果赋值给b,b的值就被赋值为13。由逗号表达式逻辑得知:整个逗号表达式的结果是最后一个表达式的结果,所以c为13。如果exp1的结果为真,那么exp2就是整个表达式的结果。如果exp1的结果为假,那么exp3就是整个表达式的结果。的真假,exp1为真,exp2计算,exp3就不计算。
2024-06-30 18:44:18
246
原创 C语言 ——— 逻辑操作符
a++ && ++b:a后置++后为2,b初始值为2,前置++后为3,a++ && ++b整体的结果同样为真,在C语言中,真的固定值为1,所以&& d++也要计算。a++ || ++b:a后置++后为1,b初始值为2,前置++后为3,|| ++b为真,所以 || d++就不会计算。a++:a初始值为1,后置++,a为真,那么|| ++b || d++都不会计算,表达式结束后a为2。a++:a初始值为0,后置++,先计算后++,0为假,那么&& ++b && d++就不会计算。
2024-06-30 15:37:42
536
原创 C语言 ——— 单目操作符
所以将flag单独放在if判断语句内,是不会进入if语句中的,但是当前面加一个逻辑反操作,就会将假变为真,则会执行第二条if语句中的内容。由最后一条代码可证明sizeof不是函数,因为可以把括号去掉,同样计算出a所占空间的字节,但函数不能去掉括号。将3.14这个小数强制类型转换为int类型,并且存储到变量a中,那么a的值就为3,直接舍去小数。变量a先自增1,变为2,再赋值给变量b,所以打印出来a为2,b为2。先将a原来的值赋值给b,b就为1,赋值后a自增1,a就为2。先使用,后++(或--)
2024-06-28 22:24:49
583
原创 C语言 ——— 不能创建第三个变量,实现两个数的交换
a = a ^ b:此时的a还是为a ^ b,此时的b已经被赋值为了a,所以原代码可替换为:a = a ^ b ^ a,由以上结论就可得出a = b。b = a ^ b:此时的a为a ^ b,原代码可替换为:b = a ^ b ^ b,由以上结论就可得出b = a。b = a - b:此时的a就为变量a、b的和,a减去b得到的就是a原来的值,然后赋值给b。a = a - b:此时的b为原来a的值,那么a减去b得到的就是原来b的值,最后赋值给a。a = a ^ b:将a ^ b存放在变量a中。
2024-06-28 16:05:54
1037
原创 C语言 ——— 按位与、或、异或操作符
(a | b)的补码为负整数,负整数的补码到原码是需要计算的。(a | b)的原码存储到变量c中,c所存储的值为:-5。由此可得(a ^ b)的原码存储的变量c中的值为:-8。对应二进制位有0则为0,两个同时为1,才是1。对应的二进制位有1则1,两个同时为0,才为0。结合以上的绘图,先计算出(a | b)的补码。(a ^ b)的补码为负整数,计算出原码。对应的二进制位相同为0,相异为1。计算(a ^ b)的补码。
2024-06-26 20:02:41
374
原创 C语言 ——— 移位操作符
a向右移一个bit位后,最低位的1就要被舍去,最高位的符号位要补全,补全有两种补全方式,算术右移和逻辑右移,下方会解释。那么b的值应该为7,因为1*2^0 + 1*2^1 + 1*2^2 = 7。a >> 1:可理解为a存储在内存中的二进制补码向右移动一个bit位。原码最高位是符号位,最高位为1,表示的是负整数,且1*2^3 = 8。左边丢弃,右边直接补0(注意:操作的、丢弃的、左移的都是数据的补码)且a为正整数,所以a的原码、反码、补码是相同的。最高位将会直接补0,那么(a >> 1)后的。
2024-06-24 18:23:22
720
原创 C语言 ——— 整数的二进制表示形式:原码、反码、补码
0000000 00000000 00000000 00001111 --- (-15)存储在变量a中的原码。1111111 11111111 11111111 11110000 --- (-15)存储在变量a中的反码。1111111 11111111 11111111 11110001 --- (-15)存储在变量a中的补码。0000000 00000000 00000000 00001111 --- 15存储在变量a中的反码。且32个bit位中的最高位符号位要为0,因为15是正整数。
2024-06-23 12:07:55
438
原创 C语言 ——— 算数操作符(除法操作符和取模操作符)
17 % 8可以看作17 / 8整除后的余数,17 / 8 = 2……1,商2余1,所以17 % 8 = 1。通过%10再/10就能得到一个多位整数的每一位,再进行相关操作。注意:除数不能为0,除数为0时程序会直接报错。注意:取模的两端必须为整数,否则程序会报错。取模得到的是两个整数整除后的余数。
2024-06-22 13:28:29
438
原创 C语言 ——— 计算一个整数的每一位之和,递归实现
第一次进入函数:判断n后执行else中的语句,return DigitSum(174 / 10) + 174 %10,return时调用了DigitSum函数,所以要再次进入函数。第二次进入函数:判断n后执行else中的语句,return DigitSum(17 / 10) + 17 % 10,return时调用了DigitSum函数,所以要再次进入函数。第三次进入函数:判断n后执行if中的语句,return 1,直接返回1,这次返回后直接返回到第二次进入函数时。自此,递归结束,最后结果返回12。
2024-06-19 23:28:57
304
原创 C语言 ——— 编写一个函数实现n的k次方,使用递归实现
注意:输入k时输入的是 -3,所以要在k前面加个负号,负负得正,且等式两端至少要有一个浮点数,得出的结果才是小数,所以是1.0。当k小于0时:n的k次方 = 1.0 / my_pow(n, -k),例如 2 的 -3 次方 = 1 / 2的3次方。当k大于0时:n的k次方 = n * my_pow(n, k-1),因为2的3次方 = 2 * 2的2次方。当k为0时:n的k次方 = 1,因为任何数的0次方都是1。例如:n = 2,k = -2。例如:n = 2,k = 2。
2024-06-18 21:23:33
268
原创 C语言 ——— 编写代码,计算1到100的整数中有多少个数字9
99如果用 if 和 else if 判断的话只能判断一次,所以要两个 if 语句分别判断个位和十位的9。一个整数(%)取模上10后得到的就是个位的值,如果这个整数小于10,得到的还是这个整数。99这个数字,个位是9,十位也是9,所以在计算个位十位有多少个9时要分开判断。所以我们可以使用整数除法,整数除以10,得到的就是整数的十位上的数。%(取模操作符)—— 操作符两边必须是整数,取模的结果为余数。
2024-06-17 11:07:33
206
原创 C语言 ——— 计算1/1 - 1/2 + 1/3 - ... + 1/99 - 1/100的值
注意:除法分为整数除法和浮点数除法,只有当除号的两端至少有一个浮点数才能执行浮点数除法,所以可以将分子的1修改为1.0。分子1不变,分母从1递增,用for循环遍历分母。
2024-06-16 10:58:19
164
原创 C语言 ——— 编写代码,求10个整数中的最大值
创建一个整型变量max,初始值赋值为0,把max和其他10个整数相比较,只要大于max,就把max赋为那个值,最后max就是最大值。还是创建整型变量max,初始值赋值为10个整数中的第一个数,再将max和其他9个整数相比较,这样就能正确的求出10个整数中的最大值。以上逻辑错误的原因在于:如果10个整数都是负数,那么0和负数相比较,最大值还是0,也就是max,所以以上方法不可取。
2024-06-15 15:45:59
206
原创 C语言 ——— 编写代码,在屏幕上输出九九乘法口诀表
当外部for循环为2时,表示第二行,那么内部for循环只循环二次,打印2*1=2 2*2=4即可。当外部for循环为1时,表示第一行,那么内部for循环只循环一次,打印1*1=1即可。创建一个for循环,用来控制行,一共是9行,所以循环9次。for循环内部再创建一个for循环,用来输出每一行的内容。由此可以用外部for循环控制内部for循环的循环次数。
2024-06-14 17:29:13
120
原创 C语言 ——— 对于数组名的理解
创建一个数组,分别打印 数组名地址 和 数组首元素地址 即可验证注意:数组名就是地址,所以以地址的形式打印的时候直接打印代码验证。
2024-06-13 13:30:07
314
原创 C语言 ——— 冒泡排序(只适用于整型数组)
那么10个元素就要进行9趟冒泡排序,因为10个元素中的9个元素都出现在自己该停留的位置上了,那么第10个元素也在自己该停留的位置上。例如要排序的数组为:int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};9 8 7 6 5 4 3 2 1 0 —— arr[0] > arr[1],则需要交换两个元素。8 9 7 6 5 4 3 2 1 0 —— arr[1] > arr[2],也需要交换。每次循环完后判断flag是否为1,为1时就停止排序,跳出循环。
2024-06-12 22:00:00
398
原创 C语言 ——— 编写代码,求第n个斐波那契数(不考虑溢出)
通过测试可以发现,计算第40个斐波那契数的时候,当n为3时,被重复多次使用,大量的重复工作,导致运行速度缓慢,所以并不建议使用递归求解第n个斐波那契数。
2024-06-11 15:18:31
235
原创 C语言 ——— 不创建临时变量,模拟实现strlen函数
此时就将所有my_strlen函数的递归完成,并且将3返回。同样拿"abc"字符串举例。
2024-06-10 16:52:28
259
原创 C语言 ——— 写一个函数,交换两个整型变量的内容(值传递和址传递)
当代码执行完Swap函数后,发现改变的只是x和y的值,并没有改变a和b的值。由上面的代码验证后发现值传递不能交换两个整型变量的值。通过验证后发现址传递可以交换两个变量的值。
2024-06-06 18:58:55
328
原创 C语言 ——— 学习并使用strcpy函数
strcpy函数的返回值为char*类型的指针变量,也就是返回目的地字符串的起始地址。不接收strcpy函数的返回值的实现。接收strcpy函数的返回值的实现。
2024-05-27 20:48:47
338
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人