C语言进阶知识
文章平均质量分 82
本专栏将讲解C语言进阶知识,从本质原理来解答C本质。
Clife@love
Clife,C生万物;希望自己通过C,学习底层、深层知识,真正热爱编程!
展开
-
C语言进阶知识(九)
目录自定义类型详解1.结构体1.1 结构体的声明及使用1.2特殊的结构体1.3结构体的自引用1.4结构体变量的初始化1.5 结构体内存对齐1.6 结构体传参2.枚举2.1枚举类型的定义2.2 枚举的使用3.联合体3.1 联合类型的定义4.2 联合的特点4.3 联合大小的计算enum Day//星期Mon,Tues,Wed,Thur,Fri,Sat,Sun。原创 2023-10-21 11:54:23 · 78 阅读 · 8 评论 -
C语言进阶知识(八)
内存拷贝函数,可能拷贝字符串,整形数组,结构体等等,所以设置成哪一种固定类型都不合适,所以参数设置void*。(1)要把arr+4的值赋给arr+2,以16个字节,也就是4个整型拷贝,新的数组为:{1,2,5,6,7,8,7,8,9,10,0,0....}(2)要把arr+4赋给arr+6,以16个字节,也就是4个整型拷贝,新的数组为:{1,2,3,4,5,6,5,6,7,8,0,0,0...}数组内现在储存的是{1,2,3,4,5,6,7,8,9,10,0,0,0,0,0,0,0,0,0,0};原创 2023-10-18 18:14:00 · 55 阅读 · 8 评论 -
C语言进阶知识(七)
这是因为此函数的返回值为size_t,是无符号的,所以系统计算的是-3,此时负号1不当符号位处理,当做数值1来处理,那这就是一个很大的数值,故出现的是大于。如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。(1)字符串'\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。我们编写函数,以\0作为判断字符个数的标志,没遇到\0,count++,指针也往前走,遇到后跳出循环,不算\0作为字符的个数。原创 2023-10-14 21:56:42 · 145 阅读 · 8 评论 -
C语言进阶知识(六)
大家一定很好奇,随机值是什么意思,我们在前提知识说过,strlen遇到\0才会停止,而我们数组里没有\0,那么函数就会在内存中一直找,直到找到\0,所以就是随机值。我们用vs,它内存储存是小端储存,我们描述它在内存中按以下方式储存,那么&a就是整个数组的地址,&a+1应该是一个数组指针,强制转化为整型指针,此时应指向图示位置,移动了一个数组,那么当a转化为int类型时,+1就应该仅仅只走一个字节,也就是下图所指位置,所以当ptr1[-1]打印时,就相当于打印04 00 00 00,且以十六进制打印;原创 2023-10-11 22:13:28 · 72 阅读 · 5 评论 -
C语言进阶知识(五)
这一段函数是核心,其核心思想利用bubble_sort函数传进来的函数指针,进行对元素的比较,由于bubble_sort可实现对所有数据的排序,所有我们要使用指针,而不是像冒泡排序那样直接进行比较,if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)这一段函数就实现了判断,之所以这里使用char*是为了解引用时候只读一个字节,这样可以和后面的相乘联系起来。那么我们今天,基于冒泡排序的思想,模拟实现qsort函数。原创 2023-10-09 21:19:49 · 61 阅读 · 9 评论 -
C语言进阶知识(四)
int (*p)(int,int)为函数指针,int(*p[4])(int,int)为函数指针数组,那么我们如果要&p,得到p的地址,此时我们就需要来存放函数指针数组的地址,也就是指向函数指针数组的指针,于是我们写出int(*(*p)[4])(int,int)=&p;如果你把函数的指针(地址)作为参数传递给另一个函数,当 这个指针被用来调用其所指向的函数时,我们就说这是回调函数。函数指针,我们依旧类比概念:字符指针是指向字符的指针,储存的是字符的地址,同理:函数指针是指向函数的指针,储存的是函数的地址。原创 2023-10-02 18:05:28 · 104 阅读 · 5 评论 -
C语言进阶知识(三)
这是因为地址是物理的电线上产生的,32位机器----32根地址线-----每根地址线产生1/0的电信号,那么以32位平台为例,32个0/1组成的二进制序列就需要4个字节来储存,同理,可推测64位平台就需要8个字节来储存地址了。这个问题先留给大家去思考。我们把整个数组的地址存在数组指针中,此时,数组指针就是指向数组的指针,储存的是数组的地址,所以要用&arr。对二维数组打印时,我们有两种常见办法,一种是用数组接收然后打印,另一种是用数组指针接收,并打印,下面给出这两种方法的函数,可根据自己的理解进行学习。原创 2023-09-27 22:14:38 · 144 阅读 · 9 评论 -
C语言进阶知识(二)
在此例中,我们将M转换时前面并没有添加1,而是添加0,这是因为E全为0,这说明原来的E应该是-127,2^(-127)一定是个极小的数,至少要比1小很多,若我们添加为1相当于增大原来的数字,误差过大。对于E,我们认为它为无符号整数,但实际上我们的E存在负值,如果E为8位,取值范围为0-255;对于M,我们有另类规定,M可写为1.xxxxxx,我们在储存时候省略1,只保存xxxxxx,这样的目的是增加有效数字的位数,如32位,有效数字可增加为24位。(-1)*S表示符号位,S为0,V为正数;原创 2023-09-21 17:27:42 · 251 阅读 · 9 评论 -
C语言进阶知识(一)
C语言进阶知识(一):数据在内存中储存。介绍整形家族的存储方式:补码;大小端概念和符号位概念。原创 2023-09-20 20:50:12 · 122 阅读 · 9 评论