C 语言 第七章 常用函数(3)

发布时间:2026/9/20 23:22:09
C 语言 第七章 常用函数(3)
目录数学运算相关的函数举例内存函数memcpy()memcmp()memmove()memset()内存管理相关函数C程序的内存分配说明​编辑void指针(无类型指针)说明举例数学运算相关的函数注math.h头文件定义了各种数学函数。在这个库中所有可用的功能都带有一个 double 类型的参数且都返回 double 类型的结果。double pow(double x, double y) 返回 x 的 y 次幂。double sqrt(double x) 返回 x 的平方根。double fabs(double x) 返回 x 的绝对值。double ceil(double x) 向上取整。double floor(double x) 向下取整。举例#include stdio.h #include math.h int main() { int d0 fabs(-3); int d1 pow(2, 3); double d2 sqrt(5.0); double d3 ceil(5.1); double d4 floor(5.9); printf(d0%d\n, d0); //d03 printf(d1%d\n, d1); //d18 printf(d2%f\n, d2); //d22.236068 printf(d3%f\n, d3); //d36.000000 printf(d4%f\n, d4); //d45.000000 return 0; }内存函数以下函数定义都在 string.h 头文件中使用前需要先导入string.h头文件。memcpy()从 source 开始位置向后复制 num 个字节的数据到 destination 的内存位置。void *memcpy(void *destination, const void *source, size_t num);举例int nums[] { 1,2,3,4 }; int numsBak[10] { 0 }; //数组复制 memcpy(numsBak, nums, sizeof(nums)); int length sizeof(nums) / sizeof(int); for (int i 0; i length; i) { printf(%d\n, numsBak[i]); }memcmp()将 ptr1 所指向的内存块的前 num 字节与 ptr2 所指向的前 num 字节进行比较如果它们都匹配则返回0。在两个内存块中不匹配的第一个字节在 ptr1 中的值小于 ptr2 中的值则返回0的数。在两个内存块中不匹配的第一个字节在 ptr1 中的值大于 ptr2 中的值则返回0的数。int memcmp(const void *ptr1, const void *ptr2, size_t num);举例char buffer1[] abcdefg; char buffer2[] abcdefg; int n memcmp(buffer1, buffer2, sizeof(buffer1)); printf(%d,n);memmove()void* memmove(void *destination, const void *source, size_t num);举例int nums[4] { 1,2,3,4 }; int n[10] {0}; memmove(n,nums,sizeof(nums)); for (int i 0; i 10; i) { printf(%d\n, n[i]); }memset()void* memset(void *ptr, int value, size_t num);注将 ptr 指向的内存块的前 num 个字节设置为指定的值一般用来初始化数组。举例int nums[5]; memset(nums,0,sizeof(nums)); for (int i 0; i 5; i) { printf(%d\n, nums[i]); }内存管理相关函数C程序的内存分配说明C程序中不同数据在内存中分配说明全局变量和静态局部变量——内存中的静态存储区/全局区非静态的局部变量——内存中的动态存储区stack栈临时使用的数据——建立动态内存分配区域需要时随时开辟不需要时及时释放——heap堆void指针(无类型指针)每一块内存都有地址通过指针变量可以获取指定地址的内存块。指针变量必须有类型否则编译器无法知道如何解读内存块保存的二进制数据。但是向系统请求内存的时候有时不确定会有什么样的数据写入内存需要先获得内存块稍后再确定写入的数据类型。说明综上为了满足这种需求C语言提供了一种不定类型的指针叫做void指针。它只有内存块的地址信息没有类型信息等到使用该块内存的时候再向编译器补充说明里面的数据类型是什么。此外由于void指针等同于无类型指针(typeless pointer)可以指向任意类型的数据但是不能解读数据。void指针与其他所有类型指针之间是互相转换关系任一类型的指针都可以转为void指针而void指针也可以转为任一类型的指针。举例int x 10; void* p x; // 整数指针转为void指针 int* q p; // void指针转为整数指针