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) :向下取整。

举例:

cs 复制代码
#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);
    //d0=3
    printf("d1=%d\n", d1);
    //d1=8
    printf("d2=%f\n", d2);
    //d2=2.236068
    printf("d3=%f\n", d3);
    //d3=6.000000
    printf("d4=%f\n", d4);
    //d4=5.000000

    return 0;
}

内存函数


以下函数定义都在 string.h 头文件中,使用前需要先导入string.h头文件。

memcpy()

从 source 开始位置向后复制 num 个字节的数据到 destination 的内存位置。

cs 复制代码
void *memcpy(void *destination, const void *source, size_t num);

举例:

cs 复制代码
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的数。
cs 复制代码
int memcmp(const void *ptr1, const void *ptr2, size_t num);

举例:

cs 复制代码
char buffer1[] = "abcdefg";
char buffer2[] = "abcdefg";
int n = memcmp(buffer1, buffer2, sizeof(buffer1));
printf("%d",n);

memmove()

cs 复制代码
void* memmove(void *destination, const void *source, size_t num);

举例:

cs 复制代码
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()

cs 复制代码
void* memset(void *ptr, int value, size_t num);

**注:**将 ptr 指向的内存块的前 num 个字节设置为指定的值,一般用来初始化数组。

举例:

cs 复制代码
int nums[5];
memset(nums,0,sizeof(nums));
for (int i = 0; i < 5; i++) {
    printf("%d\n", nums[i]);
}
 

内存管理相关函数


C程序的内存分配


说明

C程序中,不同数据在内存中分配说明:

  1. 全局变量和静态局部变量------内存中的静态存储区/全局区
  2. 非静态的局部变量------内存中的动态存储区:stack栈
  3. 临时使用的数据------建立动态内存分配区域,需要时随时开辟,不需要时及时释放------heap堆


void指针(无类型指针)


  • 每一块内存都有地址,通过指针变量可以获取指定地址的内存块。
  • 指针变量必须有类型,否则编译器无法知道如何解读内存块保存的二进制数据。
  • 但是,向系统请求内存的时候,有时不确定会有什么样的数据写入内存,需要先获得内存块,稍后再确定写入的数据类型。

说明

  • 综上,为了满足这种需求,C语言提供了一种不定类型的指针,叫做void指针。它只有内存块的地址信息,没有类型信息,等到使用该块内存的时候,再向编译器补充说明,里面的数据类型是什么。
  • 此外,由于void指针等同于无类型指针(typeless pointer),可以指向任意类型的数据,但是不能解读数据。void指针与其他所有类型指针之间是互相转换关系,任一类型的指针都可以转为void指针,而void指针也可以转为任一类型的指针。

举例

cs 复制代码
int x = 10;
void* p = &x; // 整数指针转为void指针
int* q = p; // void指针转为整数指针
相关推荐
β添砖java1 小时前
机器学习2 KNN算法、距离度量、特征预处理、超参数选择、手写数字、鸢尾花
人工智能·算法·机器学习
TAN-90°-2 小时前
Deep Learning for Computer Vision——Generative Models 2
人工智能·深度学习·神经网络·算法·目标检测·机器学习·计算机视觉
Rabitebla2 小时前
【Linux系统编程】指令(三):创建、删除、复制、移动、看内容
linux·数据结构·c++·算法
用户788477316342 小时前
用 .NET MAUI 一套 C# 同时出 Windows 和 Android:哪些是真能共享,哪些是 marketing
c#
事已至此先睡覺吧2 小时前
第三篇:Java 流程控制详解:条件判断、循环与跳转语句
java·开发语言
m0_734571762 小时前
深入理解5g <二十> dmrs
开发语言·5g
qq_410194292 小时前
.NET 8.0 下基于 PaddleOCRSharp 的离线文字识别落地指南
算法·.net
Omics Pro2 小时前
1个月2轮融资!长寿虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
residual_fan2 小时前
航空发动机故障诊断专用智能体(六):实际机队健康管理中的应用考量与展望
人工智能·算法·数据挖掘·数据分析