C语言笔记12:C语言内存函数

文章目录

C语言笔记12:C语言内存函数

一、memcpy使用和模拟实现

函数声明:

c 复制代码
void *memcpy(void* destination ,const void* source ,size_t num);

strcpy不同的是,memcpy遇到\0不会停下来

目标空间和源空间有重叠的情况是未定义的
使用:

c 复制代码
#include <stdio.h>
#include <string.h>

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

输出:

c 复制代码
1 2 3 4 5 0 0 0 0 0

模拟实现:

c 复制代码
void* memcpy(void* destination ,const void* source ,size_t num)
{
	void* ret = destination;
	assert(destination != NULL);
	assert(source != NULL);
	
	while(num--)
	{
		*(char*)destination = *(char*)source;
		destination = (char*)destination + 1;//这个写法?(char*)destination 是一个右值不能直接 += 1!!!
		source = (char*)source + 1;
	}
   return ret;
}

二、memmove的使用和模拟实现

函数声明:

c 复制代码
void* memmove(void* destination ,const void* source ,size_t num);

memmove和memcpy的区别在于:

  • memmove可以处理目的空间和源空间有重叠的情况。
    使用:
c 复制代码
#include <stdio.h>

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

结果:


模拟实现:

c 复制代码
void* memmove(void* dest ,const void* source ,size_t num)
{
	void* ret = dest;
	//判断需不需要特殊处理
	if(dest < source || dest >= source + num)
	{
		while(num--)
		{
			*(char*)dest = *(char*)source;
			dest = (char*)dest + 1;
			source = (char*)source + 1;
		}
	}
	else
	{	
		dest = (char*)dest + num - 1;
		source = (char*)source + num - 1;
		while(num--)
		{
			*(char*)dest = *(char*)source;
			dest = (char*)dest - 1;
			source = (char*)source - 1;
		}
	}
	return ret;
}

三、memset函数的使用

函数声明:

c 复制代码
void* memset(void* ptr ,int value ,size_t num);

函数使用:

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "hello world";
	memset(str,'x',5);
	printf("%s\n",str);
	
	return 0;
}

四、memcmp函数的使用

函数声明:

c 复制代码
int memcmp(const void* ptr1, const void* ptr2, size_t num);

memcmp函数和strncmp的区别是,strncmp会遇到\0停止而memcmp不会
使用:

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char buffer1[] = "Hello I am Li";
	char buffer2[] = "Hello I am GG";
	
	int ret = memcmp(buffer1,buffer2,sizeof(buffer1));//这里使用sizeof,如果是strncmp就用strlen
	if(ret > 0)
		printf("%s > %s\n",buffer1,buffer2);
		
	return 0;
}

结果:


内存函数和字符串函数的区别大致都在于\0,以及内存函数都带有size_t num这个参数,因为它不是对字符串操作,没有默认的终止位置。

相关推荐
m0_686041612 分钟前
C++中的适配器模式变体
开发语言·c++·算法
txzrxz2 分钟前
结构体排序,双指针,单调栈
数据结构·算法·双指针算法·单调栈·结构体排序
AndrewHZ6 分钟前
【AI黑话日日新】什么是AI智能体?
人工智能·算法·语言模型·大模型·llm·ai智能体
wWYy.7 分钟前
算法:二叉树最大路径和
数据结构·算法
跃渊Yuey7 分钟前
【Linux】线程同步与互斥
linux·笔记
葱明撅腚9 分钟前
利用Python挖掘城市数据
python·算法·gis·聚类
We་ct11 分钟前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表
AI视觉网奇22 分钟前
FBX AnimSequence] 动画长度13与导入帧率30 fps(子帧0.94)不兼容。动画必须与帧边界对齐。
笔记·学习·ue5
weixin_3954489123 分钟前
main.c_cursor_0129
前端·网络·算法
梵刹古音27 分钟前
【C语言】 格式控制符与输入输出函数
c语言·开发语言·嵌入式