目录
数学运算相关的函数
注: 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程序中,不同数据在内存中分配说明:
- 全局变量和静态局部变量------内存中的静态存储区/全局区
- 非静态的局部变量------内存中的动态存储区:stack栈
- 临时使用的数据------建立动态内存分配区域,需要时随时开辟,不需要时及时释放------heap堆
void指针(无类型指针)
- 每一块内存都有地址,通过指针变量可以获取指定地址的内存块。
- 指针变量必须有类型,否则编译器无法知道如何解读内存块保存的二进制数据。
- 但是,向系统请求内存的时候,有时不确定会有什么样的数据写入内存,需要先获得内存块,稍后再确定写入的数据类型。
说明
- 综上,为了满足这种需求,C语言提供了一种不定类型的指针,叫做void指针。它只有内存块的地址信息,没有类型信息,等到使用该块内存的时候,再向编译器补充说明,里面的数据类型是什么。
- 此外,由于void指针等同于无类型指针(typeless pointer),可以指向任意类型的数据,但是不能解读数据。void指针与其他所有类型指针之间是互相转换关系,任一类型的指针都可以转为void指针,而void指针也可以转为任一类型的指针。
举例
cs
int x = 10;
void* p = &x; // 整数指针转为void指针
int* q = p; // void指针转为整数指针
