C语言-内存函数详解

这篇具有很好参考价值的文章主要介绍了C语言-内存函数详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1. memcpy使用和模拟实现

返回类型和参数:

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

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3. 如果source和destination有任何的重叠,复制的结果都是未定义的。
4.注意单位是字节
5.头文件:#include<string.h>

memcpy使用:

int main() {
	int arr[20] = { 0 };//目标数组
	int arr1[] = { 1,2,3,4,5 };//源数组
	memcpy(arr, arr1, 20);//20单位是字节
	for (int i = 0; i < 5; i++) {//拷贝完打印
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数

memcpy模拟实现

1.我们创建一个返回类型和参数于memcpy函数相同的函数
2.因为memcpy函数拷贝的单位是字节,所以我们在拷贝是将类型转化为(char*)类型
3.通过循环来拷贝

代码实现:

void* mn_memcpy(void* p1, const void* p2, size_t n) {
	assert(p1);//判断是否为空指针,参数和类型memcpy一样
	assert(p2);
	while (n) {//控制拷贝多少个字节
		*((char*)p1) = *((char*)p2);//将void*转化为char*(一字节)
			((char*)p1)++; 
			((char*)p2)++;
		n--;//
	}
}
int main() {
	int arr[20] = { 0 };
	int arr1[] = { 1,2,3,4,5 };
	mn_memcpy(arr, arr1, 20);
	for (int i = 0; i < 5; i++) {//拷贝完打印
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数

2. memmove使用和模拟实现

返回类型和参数:

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

1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2. 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
3. 单位是字节
4. 头文件:#include<string.h>

memmove 使用:

 int main() {
	int arr1[] = { 1,2,3,4,5 };
	memmove(arr1+1, arr1, 3*sizeof(int));
	for (int i = 0; i < 5; i++) {//拷贝完打印
		printf("%d ", arr1[i]);
	}
	return 0;
}

运行结果:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数
memmove模拟:

1.我们创建一个返回类型和参数于memmove函数相同的函数
2.因为memmove函数拷贝的单位是字节,所以我们在拷贝是将类型转化为(char*)类型
3.我们要分三种情况考虑,再通过循环拷贝

三种情况:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数

代码实现:

void* mn_memmove(void* p1, const void* p2, size_t n) {
	assert(p1);//判断是否为NULL
	assert(p2);
	if (p1 <= p2 || (char*)p1 >= (char*)p2 + n)//包含两种情况,直接按顺序拷贝
	{
		while (n) {
			*((char*)p1) = *((char*)p2);//将void*转化为char*(一字节)
						((char*)p1)++; //(char*)p1加加,字节加一
						((char*)p2)++;
					n--;
		}
	}
	else {//第三种情况 倒序拷贝
		p1 = (char*)p1 + n - 1;
		p2 = (char*)p2 + n - 1;
		while (n) {
			*((char*)p1) = *((char*)p2);
			((char*)p1)--;
			((char*)p2)--;
			n--;

		}
	}
}
int main() {
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	mn_memmove(arr1+1, arr1, 3*sizeof(int));
	for (int i = 0; i < 10; i++) {//拷贝完打印
		printf("%d ", arr1[i]);
	}
	return 0;}

运行结果:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数

3. memset函数的使用

返回类型和参数

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

1.memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
2. 头文件:#include<string.h>

使用:

int main() {
	char arr[] = "qwert";
	memset(arr, '0', 3 * sizeof(char));
	printf("%s", arr);
	return 0;
}

运行结果:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数

4. memcmp函数的使用

返回类型和参数:

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

1.比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
2. 头文件:#include<string.h>

返回值:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数
使用:

int main() {
	char arr[] = "qwert";
	char arr1[] = "abcdf";
	if (memcmp(arr, arr1))
		printf("arr>arr1");
	else
		printf("arr1>arr");
	return 0;
}

运行结果:
C语言-内存函数详解,c语言主要知识点,c语言,开发语言,笔记,经验分享,指针,函数

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!文章来源地址https://www.toymoban.com/news/detail-751845.html

到了这里,关于C语言-内存函数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ Primer 6.5 特殊用途语言特性 6.6 函数匹配 知识点+练习题

    在给定的作用域中一个形参只能被赋予一次默认实参 局部变量不能作为默认实参,函数结束就销毁,无法当作默认实参。 除此之外,只要表达式的类型可转换成形参所需要的类型,则可以作为默认实参 将函数定义为内联函数,即加上inline,在编译时内联展开代替函数 在编译

    2024年01月22日
    浏览(46)
  • 函数的知识点

    1.下列选项中,能正确调用和运行函数的是(B) A、(function(){    console.log(1);   }) B、fun();   function fun(){console.log(1)} C、fn();   var fn = function(){console.log(1);}; D、var fn = new Function(a,console.log(a));   fn(1); 解析:A不会自动调用函数,若要调用函数,应改为(function(){consol

    2024年02月13日
    浏览(35)
  • Python函数知识点

         函数是指一段可以直接被另一段程序或代码引用的程序或代码,也叫做子程序、方法。现阶段可以理解成函数是带名字的代码块。 函数需要先定义再使用!     举个例子来说,想要判断一个三角形是不是直角三角形,需要用到勾股定理,只有先明确的定义出勾股定理是

    2023年04月09日
    浏览(41)
  • ffmpeg的函数调用知识点

    av_dump_format 会打印出AVFormatContext的内容,打印的内容是什么意思? 我们使用av_dump_format打印出如下信息: 什么是文件的容器格式? \\\"mov,mp4,m4a,3gp,3g2,mj2\\\" 表示输入文件的容器格式(Container Format)支持的扩展名。 在多媒体文件中,容器格式用于组织和存储多个音视频流以及其他

    2024年02月16日
    浏览(50)
  • python常用的函数和知识点

    三元运算符是 if-else 语句的简写。语法是value_if_true if condition else value_if_false。三元运算符是一行代码,可以替代多行 if-else 语句,使你的代码更加简洁。 上面的代码通过检查“a”是否大于“b”,如果为真则返回“a”,如果为假则返回“b”。 enumerate()函数向可迭代对象添加

    2024年02月13日
    浏览(43)
  • YOLOv5基础知识点——激活函数

    ​​​​​​​什么是激活函数该选哪种激活函数?_哔哩哔哩_bilibili 深度学习笔记:如何理解激活函数?(附常用激活函数) - 知乎 (zhihu.com)  详解激活函数(Sigmoid/Tanh/ReLU/Leaky ReLu等) - 知乎 (zhihu.com) 算法面试问题二(激活函数相关)【这些面试题你都会吗】 - 知乎 (zhi

    2024年02月09日
    浏览(52)
  • ES6知识点汇总(4)--函数

    1、参数 ES6允许为函数的参数设置默认值 函数的形参是默认声明的,不能使用let或const再次声明 参数默认值可以与解构赋值的默认值结合起来使用 上面的foo函数,当参数为对象的时候才能进行解构,如果没有提供参数的时候,变量x和y就不会生成,从而报错,这里设置默认值

    2024年02月13日
    浏览(42)
  • C语言知识点汇总

    C语言知识点保姆级总结,这不得进你的收藏夹吃灰?! 拖了很久的C语言所学知识的简单小结,内容有点多,第一次总结也可能有错误或者不全面,欢迎随时补充说明! ​ 用不同数据类型所定义的变量所占空间大小不一样,定义的变量不是保存于数据类型中,而是因为只有

    2024年01月23日
    浏览(51)
  • MATLAB知识点:prctile函数(★★★☆☆)计算百分位数

     讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第三章课后习题的过程中,我给大家拓展了一些讲义中没有

    2024年04月26日
    浏览(46)
  • [TS手册学习] 03_函数相关知识点

    TS官方手册:TypeScript: Handbook - The TypeScript Handbook (typescriptlang.org) 函数类型表达式 使用类似于箭头表达式的形式来描述一个函数的类型。 上述代码中, fn: (a:string) = void 表示变量 fn 是一个函数,这个函数有一个参数 a ,是 string 类型,且这个函数的返回值类型为 void ,即没有

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包