![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言进阶
文章平均质量分 54
Li----
这个作者很懒,什么都没留下…
展开
-
关于位段的问题
首先char类型占有一个字节,一个字节有八个比特位,所以此时我们可以放入八个比特位的内容,s.a =10,我们可以看到 char a:3;即 a 中最多存储三个比特位的数,10的比特位为1010,存储到a 开辟的一个字节中的三个比特位后变为 010 ,而且是从右向左储存,如果下一个要储存的数可以被此时 a 开辟的字节空间容纳,那么便会储存在 a 的空间中,否则就会再开辟一个字节空间进行存放, a开辟的字节的剩余空间将被废弃。第二个点是位段的空间上是按照四个字节(int)或者一个字节(char)开辟的。原创 2023-03-26 16:19:18 · 64 阅读 · 0 评论 -
自定义类型
匿名的结构体变量只能使用一次,不能在主函数中重新创建一个关于匿名结构体的变量。补充:在给结构体起了一个新名字之后,新名字在结构体中不能直接用。一个结构体变量的指针不能存放另一个结构体变量的地址。因为编译器会把两个声明当成完全不同的声明。图3 创建匿名结构体的示例。图2 创建结构体变量的示例。’ —> ' 针对结构体指针。结构体中嵌套结构体的初始化。' . ' 针对结构体。结构体变量的基本创建。原创 2023-03-24 07:56:00 · 56 阅读 · 0 评论 -
memmove函数的模拟实现
memcpy只要不拷贝重叠内存就可以了,但是memcpy在VS这种可以拷贝重叠内存,因为在VS中的memcpy库函数相当于memmove。memcmp函数的功能与 strcmp的功能相似,不过memcmp能适用的类型没有限制,这里不多做阐述。下面我们讲一下memset函数,memset的特点是以字节为单位设置内存。memmove函数可以处理内存重叠的情况,memmove函数是逆序拷贝。memcpy函数应该拷贝不重叠的内容,memcpy函数是正序拷贝。当dest在src左边且重叠,只能从前向后拷贝。原创 2023-03-23 08:54:24 · 82 阅读 · 0 评论 -
模拟实现strtok && strstr && strerror
我们在实现函数模拟代码时的主要思路是,创建三个变量,一个变量指向母字符串,一个变量指向子字符串,这两个变量用来比较两个字符串是否相等,还有一个变量作为锚,放在指向母字符串的变量的初始位置,以便找到正确的起始点的时候进行返回,当两个变量比较时发现不想等,即指向子字符串的变量还未到 \0 就出现比较的不同,那么则将锚变量向后移动以为,将母字符串变量移到锚变量位置,子字符串回到初始位置,重新开始比较,若比较结束后完全相同,那么返回锚变量指向的地址。下面先放出两种strtok函数的应用实现形式。原创 2023-03-21 20:08:04 · 84 阅读 · 0 评论 -
一些内存函数
可以看到传入的参数都是void*类型,所以可以传任意类型的参数,并且最后还要传入要拷贝的字节长度num。函数tolower函数是将大写字母转换为小写字母,toupper是将小写字母转换为大写字母,头文件为ctype.h。下面我们讲一下一个与strcpy相似的函数memcpy,二者的不同之处在于mencpy可以拷贝任何类型。下面我们讲一下isdigit函数,该函数的主要功能是判断传入的数据是否为数字。然后我们将一个与strerror函数相似的函数perror。perror函数的头文件为 stdio.h。原创 2023-03-21 19:50:21 · 74 阅读 · 0 评论 -
模拟实现strcmp&strncmp函数并对于原理进行理解
以上述代码为例,其实strcmp的实质是只要发现两个数组中按顺序比较对应字母,只要发现一个数组的大于或者小于另一个数组对应的数,就会得出大于或小于的结果,所以比较的结果不是对于整体字符串而言的,而是对于字符串中单独某个元素而言的。注意图2与图1中代码的不同,图二中只比较了两个字符串第一个元素地址的大小,如果相等的话只会输出0,但图1的代码如果第一个元素相等的话便会开始比较第一个字符,以此类推。在使用strncpy函数的时候我们要注意目标数组的空间大小是否存放的下需要复制的空间。原理代码如下图7所示。原创 2023-03-17 20:00:59 · 89 阅读 · 0 评论 -
函数的介绍
第一个注意点是该函数是以/0为结束标志的,所以如果初始化的数组是 char arr[]={'a','b','c'};的话,strlen会生成一个随机值,因为该数组没有明确的定义/0的位置。追加的地方是从被追加数组的’ \0 ‘ 开始向后替换。在追加的结束位置依然是以 ‘\0’ 为标志,在最后 \0 被追加过去后结束。还有就是 被赋予值的目的地应是可修改的空间,而不是固定的空间,如以下代码就是不可修改而导致报错。此处还要注意strlen返回的值为无符号类型,在进行无符号整型类型的运算的时候不会出现负数,原创 2023-03-14 17:27:21 · 33 阅读 · 0 评论 -
指针联系的一些解析6
该题具有迷惑性的选项是BD,我们来分析一下,arr在传参到函数后实际上函数接受的是arr的首元素地址,即数组第一行的地址,此时我们在函数中接收的时候应该将arr传参看作是存放五个元素的一位数组,那么我们要存放这么一个一维数组就要用数组指针,我们可以看到C满足所有条件,故选C。首先我们看到&aa+1,此处的意思为跳过整个aa数组指向最后一个元素后面的地址,然后强行转换类型为int*,即整型类型。然后在printf中将ptr2向前移动一个地址,此时指向的为第一行最后一个元素的地址即6的地址,然后进行解引用。原创 2023-03-13 19:45:41 · 36 阅读 · 0 评论 -
指针练习的一些解析5
我们看到题目要的是一个指向数组的指针,那么我们要找到一个数组指针,数组指针的变量名先与指针结合,再与数组结合,我们可以看到C选项中的(*p)[10]满足条件,然后题目又说数组指针其中每个元素是一个函数指针,那么(*p)[10]的类型应该是函数指针,即先与指针结合再与函数结合,可以看到C选项中的int (*(*p)[10])(int*)依然满足条件,函数形参类型为int*,返回类型为int。这个过程就叫做回调。这道题的具体思路是先将第一个元素取出,然后将其余元素左移,最后将第一个元素放在最后的位置。原创 2023-03-12 14:53:46 · 48 阅读 · 0 评论 -
指针练习的一些解读2
分析完后我们看%p和%d的区别,%d就是&p[4][2]和&a[4][2]之间相差的的字节即 -4,而%p因为是读取地址所以没有正负之分,这导致了没有将&p[4][2]-&a[4][2]的数值转换成原码读取,而是直接将补码进行读取,即%d读取的是10000000000000000000000000000100,而%p读取的是111111111111111100,又因为%p读取的是地址,所以我们要将1111111111111111111111111111111100转换为十六进制即FFFFFFFC。原创 2023-03-09 08:15:26 · 67 阅读 · 2 评论