C语言:内存函数

目录

1.memcpy

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

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
  • 这个函数再遇到\0时不会停下来
  • 如果source和destination有任何的重叠,复制的结果都是未定义的(也就是说memcpy函数最好在两个不同的数组之间拷贝)
c 复制代码
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]);
	}
}


模拟实现

c 复制代码
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函数进行处理

c 复制代码
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......
c 复制代码
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码值的大小
c 复制代码
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> 头文件中。
c 复制代码
#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;  
}

模拟实现

c 复制代码
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;
}

/考研势在必行/

相关推荐
希忘auto12 分钟前
详解MySQL安装
java·mysql
ChoSeitaku12 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨14 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
DdddJMs__13518 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
汤米粥20 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾23 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺29 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE1 小时前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
娃娃丢没有坏心思1 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++