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