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