当前位置: 首页 > news >正文

C语言:内存函数

目录

  • 1.memcpy
  • 2.memmove
  • 3.memset
  • 4.memcmp
  • 5.atoi

1.memcpy

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

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
  • 这个函数再遇到\0时不会停下来
  • 如果source和destination有任何的重叠,复制的结果都是未定义的(也就是说memcpy函数最好在两个不同的数组之间拷贝)
int main() {int a[] = { 1,2,3,4,5 };int b[10] = { 0 };memcpy(b, a, 20);for (int i = 0; i < 10; i++) {printf("%d ", b[i]);}
}

在这里插入图片描述
模拟实现

void my_memcpy(void* b, const void* a, int n) {assert(a && b);while (n--) {*(char*)b = *(char*)a;b = (char*)b + 1;a = (char*)a + 1;}*(char*)b = '\0';
}
int main() {char a[] = "Hello";char b[100];int n = 5 * sizeof(a[0]);my_memcpy(b, a, n);printf("%s\n", b);return 0;
}

注意count时字节数,因为memcpy函数的第三个参数是需要复制的字节数,因为int类型的字节数时4个字节,所以需要复制5个元素的话就需要20个字节。

2.memmove

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

  • memmove和memcpy都是起到的复制的作用,不同点是memmove函数可以处理的原内存块和目标内存的块是可以重叠的

  • 如果要处理的原空间和目标空间出现重叠,那么必须使用memmove函数进行处理

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

在这里插入图片描述

3.memset

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

  • memset函数是用来设置内存的,将内存中的值以字节为单位设置为想要的内容
  • memset函数最好不处理多字节的数据类型,比如int, double, long……
int main() {char a[] = "Hello, Paisi";memset(a, 'x', 5);printf("%s\n", a);return 0;
}

在这里插入图片描述

4.memcmp

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

  • memcmp函数的作用时比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
  • 如果ptr1 < ptr2, 则返回小于0的数
  • 如果ptr1 > ptr2,则返回大于0的数
  • 如果两个指针相等,则返回0
  • 比较的是对应位置上的ASCII码值的大小
int main() {char a[] = "Hello, Paisi";char b[] = "Hello, paisi";int ret = memcmp(a, b, sizeof(a));printf("%d\n", ret);return 0;
}

在这里插入图片描述

5.atoi

int atoi (const char * str);

  • atoi函数是用于将字符串转换为整数。它的名字是 “ASCII to Integer” 的缩写。这个函数定义在 <stdlib.h> 头文件中。
#include <stdio.h>  
#include <stdlib.h>  int main() {  const char *str = "12345";  int number = atoi(str);  printf("The number is: %d\n", number);  return 0;  
}

模拟实现

int my_atoi(const char* a) {int sign = 1;//定义正负号int result = 0;//去除空白字符while (isspace(*a)) {a++;}//处理符号if (*a == '-') {sign = -1;a++;}else if (*a == '+') {a++;}//处理数字while (isdigit(*a)) {int digit = *a - '0';//将数字字符转化为数字只需要减去字符0,因为ASCII码相减就是数字result = result * 10 + digit;a++;}return sign * result;
}
int main() {char a[] = "12345";int ret = my_atoi(a);printf("%d\n", ret);return 0;
}
/考研势在必行/

相关文章:

  • 向ChatGPT高效提问模板
  • DAY by DAY 史上最全的Linux常用命令汇总----命令格式
  • 微信小程序返回上一页刷新组件数据
  • NVMFS5A160PLZT1G汽车级功率MOSFET P沟道60 V 15A 满足AEC-Q101标准
  • 【Logback】Logback 中的 Appenders
  • C#使用Stack<T>类进行堆栈设计
  • Mybatis Plus + Spring 分包配置 ClickHouse 和 Mysql 双数据源
  • 【零基础学习04】嵌入式linux驱动中信号量功能基本实现
  • 网工内推 | 国企、上市公司网工、运维,CCNA即可,补贴福利多
  • IP数据报格式
  • 数据结构导航 -- 38篇
  • C语言 指针(5) 数组和指针题解析
  • 基于LSTM实现春联上联对下联
  • 批量提取PDF指定区域内容到 Excel 以及根据PDF里面第一页的标题来批量重命名-附思路和代码实现
  • 【InternLM 笔记】使用InternLM2-chat-1.8b制作时事问答知识库
  • “大数据应用场景”之隔壁老王(连载四)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【前端学习】-粗谈选择器
  • es6--symbol
  • gf框架之分页模块(五) - 自定义分页
  • Git 使用集
  • hadoop集群管理系统搭建规划说明
  • HTML5新特性总结
  • leetcode讲解--894. All Possible Full Binary Trees
  • maven工程打包jar以及java jar命令的classpath使用
  • Spring框架之我见(三)——IOC、AOP
  • Vue.js 移动端适配之 vw 解决方案
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 分布式熔断降级平台aegis
  • 基于web的全景—— Pannellum小试
  • 计算机常识 - 收藏集 - 掘金
  • 简单实现一个textarea自适应高度
  • 解析带emoji和链接的聊天系统消息
  • 使用agvtool更改app version/build
  • 一起参Ember.js讨论、问答社区。
  • 在Mac OS X上安装 Ruby运行环境
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (js)循环条件满足时终止循环
  • (LeetCode 49)Anagrams
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (笔试题)分解质因式
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (论文阅读30/100)Convolutional Pose Machines
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)Python 垃圾回收机制
  • ./configure、make、make install 命令
  • .cfg\.dat\.mak(持续补充)
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 常见的偏门问题
  • .Net7 环境安装配置
  • .NET开发不可不知、不可不用的辅助类(一)