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指针转为整数指针
相关推荐
夏幻灵2 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码2 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
曹牧3 小时前
C#:未被引用的函数
c#
bkspiderx4 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆4 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光4 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
信奥卷王4 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵4 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
码云数智-园园4 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言