15内存函数,比字符函数功能强大
|//void* my_memcpy(void* dest, void* src, size_t num)|//原来的可以+const不变,即const void* src。||//void* my_memmove(void* dest, const void* src, size_t num)|//不期望被修改用const限制。||//void* my_memcpy(void* dest, vo
和14有联系,但是功能比14的强大
比如strcpy是对字符串的,但是内存可以是数组,字符串等等
![[Pasted image 20251121132427.png]]
#memcpy
![[Pasted image 20251121190340.png]]
完全可以代替strcpy
意思为内存复制
```
|//int main()|
||//{|
||// //strcpy - 字符串的拷贝|
||// int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };|
||// // 0 1 2 3 4|
||// int arr2[20] = { 0 };|
||// //0 1 2 3 4|
||// //memcpy - 针对内存块进行拷贝|
||// my_memcpy(arr2, arr1, 20);|
||//|
||// int i = 0;|
||// for (i = 0; i < 20; i++)|
||// {|
||// printf("%d ", arr2[i]);|
||// }|
||//|
||// return 0;|
||//}|
|||
```
//将arr1的内容复制到arr2中,复制5*4=20个字节
![[Pasted image 20251121190522.png]]
两个不能重叠(等一下讲)
函数的实现
```
| |
|---|
|#define _CRT_SECURE_NO_WARNINGS 1|
|||
||#include <stdio.h>|
||#include <string.h>|
||#include <assert.h>|
|||
||//memcpy函数拷贝结束后,会返回目标空间的起始地址|
|||
||//void* my_memcpy(void* dest, void* src, size_t num)|//不能写int *限制死
||//{|
||// void* ret = dest;|
||// int i = 0;|
||// assert(dest && src);|
||// while (num--)|
||// {|
||// *(char*)dest = *(char*)src;|//一定要给个类型
||// src = (char*)src + 1;|
||// dest = (char*)dest + 1;|//和下面是一样的
||// }|
||// return ret;|
||//}|
```
char * 是一个字节一个字节的,力度最小最合适的
```
||//|
||//void* my_memcpy(void* dest, void* src, size_t num)|//原来的可以+const不变,即const void* src
||//{|
||// void* ret = dest;|
||// int i = 0;|
||// assert(dest && src);|
||// while (num--)|
||// {|
||// *(char*)dest = *(char*)src;|
||// ((char*)src)++;|
||// ((char*)dest)++;|//要强制类型转换
||// }|
||// return ret;|
||//}|
||//|
||//int main()|
||//{|
||// //strcpy - 字符串的拷贝|
||// int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };|
||// // 0 1 2 3 4|
||// int arr2[20] = { 0 };|
||// //0 1 2 3 4|
||// //memcpy - 针对内存块进行拷贝|
||// my_memcpy(arr2, arr1, 20);|
||//|
||// int i = 0;|
||// for (i = 0; i < 20; i++)|
||// {|
||// printf("%d ", arr2[i]);|
||// }|
||//|
||// return 0;|
||//}|
```
当然也可以拷贝到自己里
```
|/int main()|
||//{|
||// int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };|
||// // 1 2 1 2 3 4 5 8 9 10|
||//|
||// my_memcpy(arr1+2, arr1, 20);|
||//|
||// int i = 0;|
||// for (i = 0; i < 10; i++)|
||// {|
||// printf("%d ", arr1[i]);|
||// }|
||//|
||// return 0;|
||//}|
|||
```
![[Pasted image 20251121192704.png]]
并不一致
说明不适用有重复部分
![[Pasted image 20251121192752.png]]
即拷贝的与被拷贝的有重叠
比如1 2 3 4 5 6 7 8
希望在12后拷贝12345678
成1212345678
#memmove
![[Pasted image 20251121193021.png]]
区别就在于可以重叠
```
| |
|---|
|//int main()|
||//{|
||// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };|
||//|
||// memmove(arr+2, arr, 5*sizeof(int));|
||//|
||// int i = 0;|
||// for (i = 0; i < 10; i++)|
||// {|
||// printf("%d ", arr[i]);|
||// }|
||//|
||// return 0;|
```
![[Pasted image 20251121193611.png]]
函数的实现
```
| |
|---|
|/memmove函数拷贝完成后,会返回目标空间的起始地址|
||//|
||//void* my_memmove(void* dest, const void* src, size_t num)|//不期望被修改用const限制
||//{|
||// assert(dest && src);|
||// void* ret = dest;|
||// if (dest < src)|
||// {|
||// //前->后|
||// while (num--)|
||// {|
||// *(char*)dest = *(char*)src;|
||// dest = (char*)dest + 1;|
||// src = (char*)src + 1;|
||// }|
||// }|
||// else|
||// {|
||// //后->前|
||// while (num--)|
||// {|
||// *((char*)dest+num) = *((char*)src + num);|
||// }|
||// }|
||// return ret;|
||//}|
||//|
||//int main()|
||//{|
||// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };|
||//|
||// my_memmove(arr, arr+2, 5 * sizeof(int));|
||//|
||// int i = 0;|
||// for (i = 0; i < 10; i++)|
||// {|
||// printf("%d ", arr[i]);|
|// }|
||//|
||// return 0;|
||//}|
|||
```
![[Pasted image 20251121195216.png]]
会覆盖//先是在前面的情况,再是在后面的情况
#memset
内存建立
![[Pasted image 20251121200446.png]]
```
void* memset(void* ptr(要被填充的指针),int value(设置的值)size_t num(总共设置多少个值,单位是字节))
```
函数使用
```
int main()
{
char arr[] = "hell0 word";
memset(arr, 'x', 5);
printf("%s\n", arr);
return 0;
}
```
![[Pasted image 20251121201041.png]]
```
int main()
{
char arr[] = "hell0 word";
memset(arr+2, 'y', 5);
printf("%s\n", arr);
return 0;
}
```
![[Pasted image 20251121201207.png]]
注意是以字节为单位
如果是int类型,要 4 * n;
![[Pasted image 20251121201533.png]]
![[Pasted image 20251121201614.png]]
构成这个值(虽然现在不是很懂//懂了以字节来修改的//不是以元素为单位来设置的,是字节!!
#memcmp
![[Pasted image 20251121202003.png]]
```
int memcmp(const *ptr1,const *ptr2,size_t num)
```
![[Pasted image 20251121202214.png]]
```
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[] = { 1,2,3,4,8,8,8 };
int ret = memcmp(arr1, arr2, 16);//16个字节是4个数字//17则会返回-1
printf("%d\n", ret);
return 0;
}
```
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)