C 语言 内存操作篇

C 语言内存操作篇

 

         关于这个系列的函数有一个特点就是是要注意内存二字,内存是不区分大小的,即没有数据类型之说,只有字节这个单位,而char 类型正好是一个字节,所以可以将其强制转换成char类型。虽然有很多函数类似字符串函数,但是千万不要取其等同对待。内存是不管是否有结束标志'\0'的。,,,,还有就是每个函数都有size_t n;

 

1  int memcmp(const void* s1,const void* s2,size_t n)  s1中的每个字节与s2中的字节比较

千万要注意size_t n 表示的是字节数。

如:int i = -1,j = 255;memcmp(&i,&j,1);  这个返回值是0。memcmp(&i,&j,2) 返回-1

int memcmp(const void *s1,cont void* s2,size_t n)
{

      assert(s1 != NULL && s2 != NULL);
      int temp = 0;
      char* str1 = (char*)s1;//最好显示的写出强制类型转换
      char* str2 = (char*)s2;


       //记得n--要放在前面相当于for(;n--;)循环中的判断条件

      //如果放在后面就起不到作用了
      while(n-- && (temp = (*str1++ - *str2++) == 0));


      return temp;
}

 

2   void* memcpy(void* dest,const void* src,size_t n)  这里的memcpy要与strcpy区别对待。多了一个字节数的参数而且如果是对字符操作的话小心最后'\0'

 

void* memcpy(void* dest,const void* src,size_t n)

{

       assert(dest != NULL && src != NULL);

       char* ch1 = (char*)dest;

       const char* ch2 = (char*)src;

 

       while(n-- && (*ch1++ = *ch2++));//记得加(),优先级要注意

 

       return dest;

}

3 void* memmove(void* dest,const void* src,size_t n) 这个与memcpy差别就在于对内存重叠的处理,如果dest 地址在前面,那么就正常的赋值,如果在后面.则从后往前赋值.

功能上看得话完全可以用memmove代替memcpy

 

void* memmove(void* dest,const void* src,size_t n)

{

     assert(dest != NULL && src != NULL);

     char* pdest = (char*)dest;

     char* psrc = (char*)src;

 

      if(pdest < psrc)

                 while(n-- && (*dest++ = *src++));

      else

                while(n-- && (*(dest + n - 1) = *(src + n - 1)));

 

      return dest;

}

 

3 void* memccpy(void* dest,const void* src,int c,size_t n) 这个函数实现的时候要非常的小心。这个函数的返回值是指定的c的下一个地址,而且这个地址是可以解引用的。目的应该是方便赋值'\0'.于是乎就不能写成

 

       while(n-- && *pdest != (char)c && (*pdest++ = *psrc++));

       return *pdest == (char)c ? (pdest + 1) : NULL;

 

void* memccpy(void* dest,const void* src,int c,size_t n)

{

       assert(dest != NULL && src != NULL);

       char* pdest = (char*)dest;

       char* psrc = (char*)src;

 

       while(n-- && (*pdest++ = *psrc++) && *(pdest - 1) != (char)c);

 

       return *(pdest - 1) == (char)c ? pdest : NULL;

}

 

4  void* memset(void* s,int c,size_t n);

 

void* memset(void* s,int c,size_t n)

{

      assert(s != NULL);

      char* p = (char*)s;

 

      while(n-- && (*s++ = (char)c));

 

      return p;

}

 

5 void bzero(void* s,size_t n)

 

void bzero(void* s,size_t n)

{

      memset(s,0,n);

}

 

6 void* memchr(const void* s,int c,size_t n)

 

void* memchr(const void* s,int c,size_t n)

{

      assert(s != NULL);

      char* p = (char*)s;

 

      while(n-- && *p++ != (char)c);

 

      return *--p == (char)c ? p : NULL;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值