目錄
1.memcpy
使用
模擬實現
2.memmove
使用
模擬實現
3.memset
使用
4.memcmp
使用
1.memcpy
使用
void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字節數
destination:指向要復制內容的目標數組的指針,類型轉換為void*類型的指針。
source:指向要復制的數據源的指針,類型轉換為const void*類型的指針。
num:要復制的字節數。size_t是一個無符號整數類型。
1.函數memcpy從源地址(destimation)的位置開始向后復制num個字節的數據到目的地址(source)指向的內存位置
2.這個函數在遇到 '\0' 的時候并不會停下來
3.如果source和destination有任何的重疊,復制的結果都是未定義的。
演示:
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);//從arr1->arr2 20個字節int i = 0;
//這里打印10個方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
結果:
模擬實現
void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest);//判斷是否為空assert(src);void* ret = dest;//防止返回的地址變動
//逐個傳入while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return(ret);
}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 20);//從arr1->arr2 20個字節int i = 0;
//這里打印10個方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
結果:
2.memmove
使用
其實跟memcpy差不多
void * memmove ( void * destination, const void * source, size_t num );目的地址 源地址 字節數
destination:指向要復制內容的目標數組的指針,類型轉換為void*類型的指針。
source:指向要復制的數據源的指針,類型轉換為constvoid*類型的指針。
num:要復制的字節數。size t是一個無符號整數類型。
1.將num字節的值從源地址指向的位置復制到目的地址指向的內存塊。
2.復制就像使用了中間緩沖區一樣進行,從而允許目標和源重疊。
3.當源地址看見和目標地址出現重疊,可以使用memmove
?演示一下,如何重疊的
將源地址的數據傳入源地址內(實現在同一個看見重疊)
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//將源地址數據傳入(源地址+2) 發生重疊memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
這里傳入的20個字節? 從(arr+2)開始? ?后面20個字節進行重疊
模擬實現
void* my_memmove(void* dest, const void* src, size_t count)
{assert(src);//判斷是否為空void* ret = dest;//防止返回的地址變動
//這里進行判斷位置 從哪里開始進行替換if (dest <= src || (char*)dest >= ((char*)src + count)) {while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else {dest = (char*)dest + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}}return(ret);
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
結果:
3.memset
使用
void * memset ( void * ptr, int value, size_t num );源地址 要變的內容 字節數
ptr指針,指向要填充的內存塊。
value:進行設置。該值以int形式傳遞,但函數使用該值的無符號字符轉換填充內存塊。
num:要設置為值的字節數。size_t是一個無符號整數類型。
1.設置內存,將內存中的值以字節為單位設置成想要的內容。
這里就不模擬了(循環替換)
int main()
{char str[] = "hello qingtian";memset(str, 'x', 5);printf(str);return 0;
}
結果:
4.memcmp
使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );地址1 地址2 字節數
ptr1:內存塊的指針。
ptr2:內存塊的指針。
num:要比較的字節數。
1.進行比較ptr1和ptr2 從0開始比較num個
int main()
{char arr1[] = "abcdef";char arr2[] = "abdd";int n;n = memcmp(arr1, arr2, sizeof(arr2));if (n > 0)printf("'%s' 大于 '%s'\n", arr1, arr2);else if (n < 0)printf("'%s' 小于 '%s'\n", arr1, arr2);elseprintf("'%s' 等于 '%s'\n", arr1, arr2);return 0;
}