c语言的内存函数

memcpy函数的使用

void * memcpy ( void * destination, const void * source, size_t num );

destination是目的地址,source是传输地址,num是传输字节数,使用memcpy函数时会从source地址取出num个字节放在destination地址处。

#include "stdio.h"
#include <string.h>

int main()
{
	int str1[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int str2[20] = { 0 };
	memcpy(str2, str1, 32);//数组名即是首元素地址
	for (int i = 0; i < 20; i++)
	{
		printf("%d ", str2[i]);
	}
	return 0;
}

输出结果:1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0

将32字节也就是8个整型从str1赋给str2。

值得注意的是,str1与str2的地址不应该重叠,如果重叠,应该使用memmove函数。同时这个函数在遇到 '\0' 的时候并不会停下来。

memmove函数的使用

void * memmove ( void * destination, const void * source, size_t num );

memmove函数的使用与memcpy函数的使用相差不大,但是memmove函数可以处理地址有重叠的情况。

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

输出结果:1 2 3 4 1 2 3 4 5 10

数组str1+4与数组str1的地址是部分重叠,这个情况使用memmove函数。

memset函数的使用

void * memset ( void * ptr, int value, size_t num );

顾名思义,set即设置,ptr是目标地址,value是设置的值,num是设置的值所需字节数。

int main()
{
	int str1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memset(str1, 0, 40);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", str1[i]);
	}
	printf("\n");
	char str2[10]="abcdefghij";
	memset(str2, 'x', 5);
	for (int i = 0; i < 10; i++)
	{
		printf("%c ", str2[i]);
	}
	return 0;
}

输出结果:0 0 0 0 0 0 0 0 0 0
                  x x x x x f g h i j

memcmp函数的使用

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

ptr1与ptr2是需要进行比较的两个字符串的首地址,num是需要进行比较多少个字节。

int main()
{
	char str1[] = "abcdefg";
	char str2[] = "abcdEfg";

	int m=memcmp(str1, str2, 4);

	if (m > 0)
		printf("str1 > str2\n");
	if (m < 0)
		printf("str1 < str2\n");
	if (m == 0)
		printf("str1 == str2\n");

	    m = memcmp(str1, str2, 5);

	if (m > 0)
		printf("str1 > str2\n");
	if (m < 0)
		printf("str1 < str2\n");
	if (m == 0)
		printf("str1 == str2\n");
	return 0;
}

输出结果:str1 == str2
                  str1 > str2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值