c语言内存函数和数据在内存中的存储讲解

一.c语言内存函数

    1.memcpy的使用和模拟实现:

       1.memcpy的使用:

         void * memcpy ( void * destination, const void * source, size_t num )

      • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
      • 这个函数在遇到 '\0' 的时候并不会停下来。
      • 如果source和destination有任何的重叠,复制的结果都是未定义的。
   
   
     
       memcpy函数与strnapy第三个参数不同,memcpy第三个参数是字节数,而strcpy第三个参数是要拷贝几个字符。也就是说memcpy运用的类型更多而strncpy只能用于字符串中。
        

        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 );

     • ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节er
     • 返回值如下:
 

 二.数据在内存中的存储:

        1.整数在内存中的存储:

               对于整形来说:数据存放内存中其实存放的是补码。

               正整数的原、反、补码都相同。

               负整数的三种表⽰⽅法各不相同。

               原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 
               反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
               补码:反码+1就得到补码。
                
               补码取反+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.练习七:

 

 9.练习八:

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值