1. memcpy使用和模擬實(shí)現(xiàn)
返回類型和參數(shù):
void * memcpy ( void * destination, const void * source, size_t num );
1.函數(shù)memcpy從source的位置開始向后復(fù)制num個(gè)字節(jié)的數(shù)據(jù)到destination指向的內(nèi)存位置。
2.這個(gè)函數(shù)在遇到 ‘\0’ 的時(shí)候并不會(huì)停下來。
3. 如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。
4.注意單位是字節(jié)
5.頭文件:#include<string.h>
memcpy使用:
int main() {
int arr[20] = { 0 };//目標(biāo)數(shù)組
int arr1[] = { 1,2,3,4,5 };//源數(shù)組
memcpy(arr, arr1, 20);//20單位是字節(jié)
for (int i = 0; i < 5; i++) {//拷貝完打印
printf("%d ", arr[i]);
}
return 0;
}
運(yùn)行結(jié)果:
memcpy模擬實(shí)現(xiàn)
1.我們創(chuàng)建一個(gè)返回類型和參數(shù)于memcpy函數(shù)相同的函數(shù)
2.因?yàn)閙emcpy函數(shù)拷貝的單位是字節(jié),所以我們?cè)诳截愂菍㈩愋娃D(zhuǎn)化為(char*)類型
3.通過循環(huán)來拷貝
代碼實(shí)現(xiàn):
void* mn_memcpy(void* p1, const void* p2, size_t n) {
assert(p1);//判斷是否為空指針,參數(shù)和類型memcpy一樣
assert(p2);
while (n) {//控制拷貝多少個(gè)字節(jié)
*((char*)p1) = *((char*)p2);//將void*轉(zhuǎn)化為char*(一字節(jié))
((char*)p1)++;
((char*)p2)++;
n--;//
}
}
int main() {
int arr[20] = { 0 };
int arr1[] = { 1,2,3,4,5 };
mn_memcpy(arr, arr1, 20);
for (int i = 0; i < 5; i++) {//拷貝完打印
printf("%d ", arr[i]);
}
return 0;
}
運(yùn)行結(jié)果:
2. memmove使用和模擬實(shí)現(xiàn)
返回類型和參數(shù):
void * memmove ( void * destination, const void * source, size_t num );
1.和memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和?標(biāo)內(nèi)存塊是可以重疊的。
2. 如果源空間和?標(biāo)空間出現(xiàn)重疊,就得使?memmove函數(shù)處理。
3. 單位是字節(jié)
4. 頭文件:#include<string.h>
memmove 使用:
int main() {
int arr1[] = { 1,2,3,4,5 };
memmove(arr1+1, arr1, 3*sizeof(int));
for (int i = 0; i < 5; i++) {//拷貝完打印
printf("%d ", arr1[i]);
}
return 0;
}
運(yùn)行結(jié)果:
memmove模擬:
1.我們創(chuàng)建一個(gè)返回類型和參數(shù)于memmove函數(shù)相同的函數(shù)
2.因?yàn)閙emmove函數(shù)拷貝的單位是字節(jié),所以我們?cè)诳截愂菍㈩愋娃D(zhuǎn)化為(char*)類型
3.我們要分三種情況考慮,再通過循環(huán)拷貝
三種情況:
代碼實(shí)現(xiàn):
void* mn_memmove(void* p1, const void* p2, size_t n) {
assert(p1);//判斷是否為NULL
assert(p2);
if (p1 <= p2 || (char*)p1 >= (char*)p2 + n)//包含兩種情況,直接按順序拷貝
{
while (n) {
*((char*)p1) = *((char*)p2);//將void*轉(zhuǎn)化為char*(一字節(jié))
((char*)p1)++; //(char*)p1加加,字節(jié)加一
((char*)p2)++;
n--;
}
}
else {//第三種情況 倒序拷貝
p1 = (char*)p1 + n - 1;
p2 = (char*)p2 + n - 1;
while (n) {
*((char*)p1) = *((char*)p2);
((char*)p1)--;
((char*)p2)--;
n--;
}
}
}
int main() {
int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
mn_memmove(arr1+1, arr1, 3*sizeof(int));
for (int i = 0; i < 10; i++) {//拷貝完打印
printf("%d ", arr1[i]);
}
return 0;}
運(yùn)行結(jié)果:
3. memset函數(shù)的使用
返回類型和參數(shù)
void * memset ( void * ptr, int value, size_t num );
1.memset是?來設(shè)置內(nèi)存的,將內(nèi)存中的值以字節(jié)為單位設(shè)置成想要的內(nèi)容。
2. 頭文件:#include<string.h>
使用:
int main() {
char arr[] = "qwert";
memset(arr, '0', 3 * sizeof(char));
printf("%s", arr);
return 0;
}
運(yùn)行結(jié)果:
4. memcmp函數(shù)的使用
返回類型和參數(shù):
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
1.比較從ptr1和ptr2指針指向的位置開始,向后的num個(gè)字節(jié)
2. 頭文件:#include<string.h>
返回值:
使用:
int main() {
char arr[] = "qwert";
char arr1[] = "abcdf";
if (memcmp(arr, arr1))
printf("arr>arr1");
else
printf("arr1>arr");
return 0;
}
運(yùn)行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-751845.html
以上就是我的分享了,如果有什么錯(cuò)誤,歡迎在評(píng)論區(qū)留言。
最后,謝謝大家的觀看!文章來源地址http://www.zghlxwxcb.cn/news/detail-751845.html
到了這里,關(guān)于C語言-內(nèi)存函數(shù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!