内存函数的解释

内存函数

(1)memcpy

void * memcpy ( void * dest, const void * src, size_t num ); num以字节为单位

把src中的前num个字节拷贝到dest中,返回拷贝完后的dest的地址

把前20字节的arr3内容拷贝到arr4中:

 例二

 

模拟实现memcpy:

#include

#include

void* my_memcpy(void* dest, void* src, size_t num)

{

void* ret = dest;

assert(dest && src);

while (num--)

{

*(char*)dest = *(char*)src;

(char*)dest = (char*)dest + 1;

(char*)src=(char*)src + 1;

}

return ret;

}

int main()

{

int arr1[5] = { 0 };

int arr2[] = { 1,2,3,4,5,6,7,8,9,10 };

my_memcpy(arr1, arr2, 20);

int i = 0;

for (i = 0; i < 5; i++)

{

printf("%d\n", arr1[i]);

}

return 0;

}

(2)memmove(包含了memcpy)

void *memmove( void *dest, const void *src, size_t count );

把src中的前count个字节拷贝到dest中,返回拷贝完后的dest的地址

拷贝时可重叠:把arr3中的1,2,3,4,5拷贝到3,4,5,6,7的位置变成1,2,1,2,3,4,5,8,9,10

把arr3地址开始的20个字节拷贝到arr3+2开始的20个字节的空间中

 

虽然memcpy也能完成覆盖的任务,支持重叠拷贝:

其实,C语言只要求:

memcpy能拷贝不重叠的内存空间就可以了

memmove去处理那些重叠内存拷贝

但是发现VS memcpy 函数也能实现重叠拷贝

60分-> 100分

模拟实现memmove

 

//模拟实现memmove

#include

#include

void* my_memmove(void* dest, void* src, size_t num)

{

void* ret = dest;

assert(dest && src);

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+2, arr, 20);

int i = 0;

for (i = 0; i < 10; i++)

{

printf("%d\n", arr[i]);

}

return 0;

}

————————————————————————————————

while(n--)

例子:若n是5,则 n-- 的判断顺序如下

第一次判断:符号在后,后递减,先参与运算,也就是先将n本身作为while()语句判断,n=5 > 0,即while()判断结果为真,判断执行结束后,此时将n递减 n=4,n递减后,也就是while(n–)语句执行结束,因为刚才while()语句的结果为真,所以此时执行循环体中的printf(),最终打印 4 ,再进入下一次循环,

当n本身是1时,1 > 0,判断为真,将n递减,此时n=0,while(n–)语句结束,因为刚才while()语句结果为真,执行循环体中的printf(),最终打印 0,进入下一次循环,

当n本身是0时, 0 > 0,判断为假,将n递减,此时n=-1,while(n–)语句结束,因为刚才while()语句结果为假,不执行循环体中的printf(),退出while循环

————————————————————————————————

(3)memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

比较ptr1和ptr2的前count个字节是否相等,ptr1>ptr2返回正数,相等返回0

比较从ptr1和ptr2指针开始的num个字节

 

(4)memset(以字节设置内存的函数)

memset void *memset( void *dest, int c, size_t count );

①字节为单位修改,把arr前10个字节改成0

 

②把arr前10个字节改成x

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值