一.c语言内存函数
1.memcpy的使用和模拟实现:
1.memcpy的使用:
void * memcpy ( void * destination, const void * source, size_t num )
2.memcpy的模拟实现:
2.memmove的使用和模拟实现:
1.memmove的使用:
void * memmove ( void * destination, const void * source, size_t num );
• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
2.memmove的模拟实现:
这一种情况是当要拷贝的地方在源数据后面,由上述分析图可知如果覆盖的话,source先将3覆盖成1,再将4覆盖成2,但是到5的时候应该覆盖3的但是3已经被1覆盖所以这样从前向后覆盖是行不通的,此时应该从后向前覆盖。
另一种情况:要拷贝的地方在源数据前面
如果是这种情况的话如果从后向前覆盖会出现与上面的情况一样会重复覆盖,这种情况要从前往后覆盖就行的通了
总的分析:
在这里就划分了三个界限 但是又因为最后一个界限两种方法都可以使用所以就划分了两个地方,一个是dest<source用从前向后拷贝的方法,另一个是dest>source用从后向前拷贝的方法
3.memset的使用:
void * memset ( void * ptr, int value, size_t num );
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
4.memcmp的使用:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
二.数据在内存中的存储:
1.整数在内存中的存储:
对于整形来说:数据存放内存中其实存放的是补码。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
2.大小端字节序和字节序的判断:
在vs2022中经过调试可以看出数据在内存中的存储是倒着存储的。
1.大小端的含义:
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:
怎么理解高低位字节呢,例如0x11223344,可以将其看成十进制的个位十位百位等等,所以个位44就是低位字节,11就是高位字节。
2.练习一(写一个程序判断当前机器的字节序):
3.练习二:(解析了signed char 和unsigned char 的范围)
在解析这个练习之前要弄清signed char 和unsigned char 的范围:
所以综上singed char的范围为-128~127,unsigned char的范围为0~255。
4.练习三:
5.练习四:
6.练习五:(解释了这些类型范围其实是个闭环)
拿signed char来举例子-128之后就127 127+1后就是-128。所以其他类型也是如此。
7.练习六:
8.练习七: