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这个参数,因为它不是对字符串操作,没有默认的终止位置。

相关推荐
摸个小yu1 分钟前
【力扣LeetCode热题h100】链表、二叉树
算法·leetcode·链表
汀、人工智能7 分钟前
[特殊字符] 第93课:太平洋大西洋水流问题
数据结构·算法·数据库架构·图论·bfs·太平洋大西洋水流问题
ZPC821019 分钟前
rviz2 仿真控制器与真实机器人切换
人工智能·算法·机器人
澈20725 分钟前
双指针,数组去重
c++·算法
小辉同志1 小时前
207. 课程表
c++·算法·力扣·图论
CheerWWW1 小时前
深入理解计算机系统——位运算、树状数组
笔记·学习·算法·计算机系统
kang_jin1 小时前
C语言结构体入门:stu定义与成员使用
c语言·教程·编程语言·入门·结构体
中屹指纹浏览器1 小时前
2026浏览器指纹检测技术演进与多账号反检测实战策略
经验分享·笔记
锅挤2 小时前
数据结构复习(第一章):绪论
数据结构·算法
skywalker_112 小时前
力扣hot100-5(盛最多水的容器),6(三数之和)
算法·leetcode·职场和发展