0
点赞
收藏
分享

微信扫一扫

C语言—内存操作函数

止止_8fc8 2022-02-15 阅读 106

一、memcpy

void* memcpy(void* dest, const void* src, size_t num)

notes: strcpy与memcpy区别 1、strcpy()字符串拷贝,它的拷贝结束是需要'\0'的,同时只针对字符串

                                              2、memcpy()什么类型都可以拷贝,同时可以规定拷贝的个数

各传入参数的含义

(1)dest:即将被拷贝进去的首地址

(2)src:用于拷贝的元素的首地址(因为源地址的内容是不需要改变的因此可以定义为const void* 类型)

(3)num:一共要拷贝的字节数,是一个字节一个字节的拷贝

memcpy()函数的运用

int main()
{
	int arr3[] = { 1, 2, 3, 4, 5, 6, 7, 9, 8, 10 };
	int arr4[5] = { 0 };
	memcpy(arr3, arr4, 5 * sizeof(arr3[0]));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr3[i]);
	}
	return 0;
}

my_memcpy()模拟实现

#include <stdio.h>
#include <assert.h>
//memcpy模拟实现void *memcpy( void *dest, const void *src, size_t count );
void* my_memcpy(void* dest, const void* src, int count)
{
	assert(dest && src);
	for (int i = 0; i < count; i++)
	{
		*((char*)dest + i) = *((char*)src + i);
	}
}

int main()
{
	char arr1[] = "hello************";
	char arr2[] = "www";
	my_memcpy(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

二、memmove

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

notes:memmove和memcpy的区别1、memmove()可以进行对内存重叠的拷贝

                                                        2、memcpy()C语言规定只拷贝不重叠的内存,但在VS上也能实现重叠拷贝,无法保证所有编译器都可以

memmove()函数应用

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
	memmove(arr + 1, arr + 3, 20);
	for (int i = 0; i < 11; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

memmove()模拟实现 

 

#include <stdio.h>
#include <assert.h>
//memmove模拟实现void *memmove( void *dest, const void *src, size_t count );
void* my_memmove(void* dest, void* src, int count)
{
	if (dest > src)
	{
		for (int i = count-1; i >= 0; i--)
		{
			*((char*)dest + i) = *((char*)src + i);
		}
	}
	else
	{
		for (int i = 0; i < count; i++)
		{
			*((char*)dest + i) = *((char*)src + i);
		}
	}
}
void show_arr(int* p, int sz)
{
	for (int i = 0; i < sz; i++)
		printf("%d ", p[i]);
	printf("\n");
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	show_arr(arr, sz);
	my_memmove(arr, arr + 3, 20);
	show_arr(arr, sz);

}

 

举报

相关推荐

0 条评论