前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >轻松拿捏C语言——【内存函数】

轻松拿捏C语言——【内存函数】

作者头像
用户11162265
发布于 2024-06-14 06:55:32
发布于 2024-06-14 06:55:32
11300
代码可运行
举报
文章被收录于专栏:C语言C语言
运行总次数:0
代码可运行

C语言中的内存操作函数:memcpy, memmove, memset, memcmp

在C语言中,我们经常需要对内存块进行各种操作,比如复制、移动、设置值以及比较。C标准库提供了四个非常有用的函数来处理这些操作:memcpy, memmove, memset, memcmp

下面我将逐一介绍这些函数及其用法。

💕1. memcpy()💕

用于从源内存块复制指定数量的字节到目标内存块。这个函数不检查源内存和目标内存是否重叠,因此如果重叠,它可能会导致未定义的行为。

函数原型❤️

void *memcpy(void *dest, const void *src, size_t n);

  • dest:指向目标内存块的指针。
  • src:指向源内存块的指针。
  • n:要复制的字节数。
  • 这个函数在遇到 '\0' 的时候并不会停下来。

示例❤️

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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);
 int i = 0;
 for (i = 0; i < 10; i++)
 {
 printf("%d ", arr2[i]);
 }
 return 0;
}

打印 1 2 3 4 5 0 0 0 0 0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>  
#include <string.h>  
int main() {  
    char src[] = "Hello, World!";  
    char dest[20];  
    memcpy(dest, src, 13); // 复制前13个字节(包括空字符'\0')  
    printf("%s\n", src);  
    printf("%s\n", dest);  
    return 0;  
}

函数模拟❤️

法一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//法一
void* my_memcpy1(void* dest,const void* source, size_t num)
{
	void* ret = dest;
	while (num--)
	{
		//*((char*)dest)++ = *((char*)source)++;
		*(char*)dest = *(char*)source;
		dest = (char*)dest + 1;
		source = (char*)source + 1;
	}
	return ret;
}

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

法二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//法二
void* my_memcpy2(void* dest, void* src, size_t num)
{
	char* d = (char*)dest;
	char* s = (char*)src;
	while (num--)
	{
		*d++ = *s++;
	}
	return dest;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8 };
	int arr2[5] = { 0 };
	//memcpy(arr2, arr1 + 2, 17);
	my_memcpy2(arr2, arr1 + 2, 17);
    int i;
    for (i = 0; i < 5; i++)
	    printf("%d ", arr2[i]);
	return 0;
}

打印3 4 5 6 7

🌟🌟2. memmove()

memmove() 函数与 memcpy() 类似,但它可以正确处理源内存和目标内存重叠的情况。

如果源空间和目标空间出现重叠,就得使用memmove函数处理。

memmove也具有memcpy的功能

函数原型🌙

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

参数与 memcpy() 相同。

示例🌙

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

打印1 2 1 2 3 4 5 8 9 10

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>  
#include <string.h>  

int main() {
    char str[] = "Hello, World!";
    memmove(str + 6, str, 5); 
    printf("%s\n", str);

    return 0;
}

打印Hello,Hellod!

函数模拟实现🌙

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void* my_memmove(void* dest, void* src, size_t num)
{
	char* d = (char*)dest;
	char* s = (char*)src;
	if (dest < src)
	{
		while (num--)
			*d++ = *s++;
	}
	else
	{
		while (num--)
			*(d + num) = *(s + num);
	}
	return dest;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//memmove(arr, arr + 2, 12);

	/*char str[] = "Hello, World!";
	memmove(str + 6, str, 5);
	printf("%s\n",str);*/
	my_memmove(arr, arr + 2, 12);
	int i = 0;
	for (i; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}

打印3 4 5 4 5 6 7 8 9 10

💕3. memset()💕

memset() 函数用于将指定内存块的前n个字节设置为某个给定的值(一个无符号字符)。

函数原型❤️

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

memset是来设置内存的,将内存中的值以字节为单位设置成想要的内容 。

从地址ptr开始往后的num个字节都设置成value

示例❤️

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}

输出:xxxxxxworld

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>  
#include <string.h>  

int main() {
    char str[50]={0};

    memset(str, 'A', 10); // 将str的前10个字节设置为'A'  

    printf("%s\n", str);   

    return 0;
}

输出 :AAAAAAAAAA

注意:memset() 只会设置到字符串的指定长度,并不会自动添加字符串结束符 '\0'。

🌟🌟4. memcmp()

memcmp() 函数用于比较两个内存块的内容。

函数原型🌙

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

• 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节

如果ptr1和 ptr2 的前n个字节完全相同,则返回 0;

如果 ptr1小于 ptr2 ,则返回一个小于 0 的值;

如果ptr1大于 ptr2 ,则返回一个大于 0 的值。

示例🌙

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,3,6,5 };
	int ret = memcmp(arr1, arr2,13);
	printf("%d", ret);//-1
	return 0;
}

打印-1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>  
#include <string.h>  

int main()
{
    char str1[] = "Hello";
    char str2[] = "World";

    int result = memcmp(str1, str2, 5); // 比较两个字符串的前5个字节  

    if (result < 0) {
        printf("str1 is less than str2\n");
    }
    else if (result > 0) {
        printf("str1 is greater than str2\n");
    }
    else {
        printf("str1 is equal to str2\n");
    }

    return 0;
}

打印:str1 is less than str2

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
顾问必备的修图小技巧1-如何用windows系统自带画图工具快速调整证件照背景色?
做项目的朋友都会遇到一个问题,就是项目现场需要最新的证件照,手头有存的电子版的证件照但是颜色需要调整,自己不会PS软件或自己本机也没有装PS,又懒得网上搜抠图工具,只要证件照要求不是太高,不妨如使用Windows系统自带的画图工具调整背景色,简单快捷,如果你用多了画图工具,你会发现根本不需要用什么专业的PS软件或抠图工具。下面介绍下如何用windows系统自带画图工具快速调整证件照背景色。注:网络上确实也有很多免费的在线抠图工具,使用起来确实也方便,但是Windows系统自带的画图工具绝对是一个不错的选择,只要有电脑,不用担心有无网络或丢失遗忘。
齐天大圣
2022/11/28
4.9K0
顾问必备的修图小技巧1-如何用windows系统自带画图工具快速调整证件照背景色?
我用 pyhton 做了款可开淘宝店赚钱的工具
之前给大家介绍了一款 AI 抠图神器:Remove.bg ,使用 Python 调用 API 快速完成了照片抠图和证件照换底色,5 秒钟就能搞定一张图片,效果相当不错。
数据森麟
2019/09/27
5370
我用 pyhton 做了款可开淘宝店赚钱的工具
【第6期】PS入门课程笔记
昨天晚上花了点时间,把第一期的PS作业做了。其实原理非常简单,就是将一张白色底的证件照做成蓝色底的、红色底的。因为是第一期的作业,掌握的PS技能还不是非常熟练,所以换底的时候主要使用的是橡皮擦这个工具。
siberiawolf
2020/03/24
6840
【第6期】PS入门课程笔记
证件照如何变换底色?以下2种方法完全免费,杜绝再花冤枉钱
证件照是平时使用最多的特殊照片,为什么说它特殊呢?因为证件照对于不同的场合有着不同的要求,比如学校、护照一般需要蓝底照片,医保、暂住证需要红底照片等,那么每次因为背景问题需要重新拍摄一组证件照,真的非常麻烦,并且非常费钱。
科技脑洞在线
2019/08/21
9K0
证件照如何变换底色?以下2种方法完全免费,杜绝再花冤枉钱
【ps学习记录】0224练习
3.磁性套索工具:具有磁性,可以识别物体边缘(边缘清晰),操作发生偏移可以通过delete进行点的删除(回车可快速成选区)
KEVINGUO_CN
2020/03/16
3960
免费!动动手一键擦图去水印的“神器”来了,再不用费劲打开PS~
静电说:之前推荐了一个抠图网站,今天再来给大家安利一个擦图插件。图片里的多余元素,旅游照背景中误入的路人甲,都可以轻松一键去除了!
用户5009027
2022/10/27
1.1K0
免费!动动手一键擦图去水印的“神器”来了,再不用费劲打开PS~
ps工具栏快捷键大全-详细介绍5种PS中常用的抠图技巧,助你快速抠出你想要的区域
  抠图是图像处理中最常做的操作之一,也是中最为常用的技术之一。抠图其实并不难,只要你有足够的耐心和细心,只须掌握PS中一些基础知识就能完美的抠出图片。本文详细介绍PS种常用的5种抠图技术,分别是利用魔术棒工具、快速选择工具、磁性套索工具、多边形套索工具 、内容识别填充进行抠图,助你快速抠出你想要的区域。
宜轩
2022/12/29
1.3K0
Photoshop软件应用项目(二)
打开 PS 软件将需要抠的动物拖进去,这是一个底为纯白的猫科类动物直接点击对象选择工具全选整张图片系统会自动给出一个选区但选区肯定会有所缺损
设计者
2022/12/20
8390
Photoshop软件应用项目(二)
不会PS抠图?来试试这招吧!
之前写Photoshop处理实验动物大体图片的内容,讲过使用钢笔工具抠除背景这一方法。
Mark Chen
2020/07/21
4640
不会PS抠图?来试试这招吧!
PS套索工具抠图及快捷键[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/150530.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
3.7K0
PS之“星球大战”
宙浩瀚,自古以来人类对其一直抱有极大的好奇心。而作为宇宙的重要组成部分——星球,更是人类探索宇宙最直观的体现。就拿离地球最近的“月亮”来说,中国古代对其描写的诗词句赋不尽其数:“大漠沙如雪,燕山月似钩”,“明月出天山,苍茫云海间”……今天就为大家讲解如何在图片上制作星球,使‘明月’生之于‘海上’。
算法与编程之美
2020/04/15
5460
用PS拼一张海报
哈喽!各位小伙伴大家好呀! 上期说了如何使用PS简单抠图,本期就再多讲一个如何拼一张海报, 或者背景图吧,当举行活动或者发表文章配图,或者宣传报,都能用上的。 小编演示所使用的是PS 2015 64位
简单并不简单
2019/09/09
9980
前端切图-PhotoShop软件使用教程(png+jpg格式图片)
部分看了文章的设计师,来找我说怎么切图。sorry?在我的理解,这就是切图啊,但是他们所指的“切图”是,怎么把设计图制作成html页面。
xing.org1^
2018/05/29
1.8K7
【教程】复古电影海报效果设计
2、新建一个图层命名cloud,用吸管工具吸取人像上最暗地方的颜色,选择滤镜—渲染—云彩,如下。
宇相
2018/08/06
5110
【教程】复古电影海报效果设计
我用 pyhton 做了款可开淘宝店赚钱的工具
之前给大家介绍了一款 AI 抠图神器:Remove.bg ,使用 Python 调用 API 快速完成了照片抠图和证件照换底色,5 秒钟就能搞定一张图片,效果相当不错。
龙哥
2019/08/20
6050
我用 pyhton 做了款可开淘宝店赚钱的工具
PS基础之移动工具和分布对齐
如果感觉小方块之间的间距还是偏大或偏小,只要改变两端方块的距离(移上或移下),再使用垂直分布调整即可
兮动人
2021/06/11
1.5K0
PS基础之移动工具和分布对齐
又一AI神器!3行代码5秒抠图,根本无需PS
导读:曾几何时,「抠图」是一个难度系数想当高的活儿,但今天要介绍的这款神工具,只要 3 行代码 5 秒钟就可以完成高精度抠图,甚至都不用会代码,点两下鼠标就完成了。
IT阅读排行榜
2019/07/24
3.2K0
又一AI神器!3行代码5秒抠图,根本无需PS
又一AI神器!3行代码5秒抠图,根本无需PS
是不是很赞?什么 PS 、PPT 修图都 low 爆了,你软件还没打开,我这边都修完了。
AI科技大本营
2019/07/16
1.2K0
又一AI神器!3行代码5秒抠图,根本无需PS
ps切图必知必会
对于前端切图,相信很多小伙伴都不会陌生,但是对于新手,有时却很棘手,想着我本是来写代码的,你给我一张图干嘛的, 有时,或许你总奢望着UI设计师,把所有的图都给你切好,你只管撸码的,然而事实并非如此,有时候呢,设计师给我们的图,也并非是一成不变,往往也需要作一些调整,更改,完美的将UI设计图,进行还原实现产品经理的意图,是前端小伙伴职责所在,那么熟练简单的ps操作,就很重要了,虽然我们不是设计者,但是我们是具体的实现者,实现从0到1的过程,至于前端ps操作,绝大多数工作是简单的切图(抠图),测量,图片简单的处理,将图片利用web技术进行填充布局实现静态页面展现就可以了,至于,ps软件,我也只是停留在简单的使用,有时候,在一些群里,看到一些小伙伴,对于切图,有些畏惧,打开ps软件,无从下手,有时候呢,即使自己曾今,ps技术玩的很溜,但是只要一段时间没有去接触,就会很陌生,一些习以为常的技巧,忘得一干二净,非常苦恼,您将在本篇学会一些常用的奇淫绝技,完全可以胜任ps切图工作,今天,就我的学习和使用,跟大家分享一下自己的学习心得,如果你已经是老司机了,可以直接忽略,欢迎路过的老师,多提意见和指正
itclanCoder
2020/10/28
3.1K0
ps切图必知必会
图像编辑软件Photoshop CS6下载_Photoshop 中文下载-永久激活
Photoshop是一款由Adobe Systems开发的图像编辑软件,被广泛用于图像处理和图形设计。以下是Photoshop软件的介绍和特点:
用户10519159
2023/04/28
6090
推荐阅读
相关推荐
顾问必备的修图小技巧1-如何用windows系统自带画图工具快速调整证件照背景色?
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 💕1. memcpy()💕
  • 函数原型❤️
  • 示例❤️
  • 函数模拟❤️
  • 🌟🌟2. memmove()
  • 函数原型🌙
  • 示例🌙
  • 函数模拟实现🌙
  • 💕3. memset()💕
  • 函数原型❤️
  • 示例❤️
  • 🌟🌟4. memcmp()
  • 函数原型🌙
  • 示例🌙
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档