一些函数:
<stdarg.h >
1.可变参数
int func_name(int num, ...); //声明方式,num代表输入的个数,当然也可以加一些其他的要传的变量在前面 |
在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
va_list valist; |
使用 int 类型的参数(一般就是上面的arg1)和 va_start() 宏来初始化 va_list 变量为一个参数列表。宏 va_start() 是在 stdarg.h 头文件中定义的。
//为num个参数初始化 valist |
使用 va_arg() 宏和 va_list变量来访问参数列表中的每个项。
for (i = 0; i < num; i++){ |
使用宏 va_end() 来清理赋予 va_list 变量的内存。
var_end(valist); |
输出平均值:
#include <stdio.h>
#include <stdarg.h>double average(int num,…)
{
va_list valist;
double sum = 0.0;
int i;
/* 为 num 个参数初始化 valist */
va_start(valist, num);
/* 访问所有赋给 valist 的参数 */
for (i = 0; i < num; i++)
{
sum += va_arg(valist, int);
}
/* 清理为 valist 保留的内存 */
va_end(valist);
return sum/num;}
int main()
{
printf(“Average of 2, 3, 4, 5 = %f\n”, average(4, 2,3,4,5));
printf(“Average of 5, 10, 15 = %f\n”, average(3, 5,10,15));
}
<string.h>
1.memcpy()/memmove()
memcpy() 函数:用于从源内存区域复制数据到目标内存区域。它接受三个参数,即目标内存区域的指针、源内存区域的指针和要复制的数据大小(以字节为单位)。
void *memcpy(void *dest, const void *src, size_t n);
//n是字节数,dest是要复制到的地方的首地址,src则是要复制的数据的首地址复制字符数组数据:
int main() {
char source[] = "Hello, World!";
char target[20];
memcpy(target, source, strlen(source) + 1);//复制'\0'
//其他类型用sizeof即可
printf("%s\n", target);
return 0; }memmove() 函数:类似于 memcpy() 函数,但它可以处理重叠的内存区域(对于memcpy(),此时行为是未定义的)。它接受三个参数,即目标内存区域的指针、源内存区域的指针和要复制的数据大小(以字节为单位)。
用法同上。如果重叠,就将src的对应个数的数据直接复制过去(覆盖导致的变化不会影响后续的复制)
比如
int main() {
char arr[11] = "abcdefghij";
memmove(arr + 1, arr + 2, 5);
printf("%s\n", arr);
return 0;
}
//输出是acdefgghij
2.memset
一些额外的东西:
1.柔性数组(C99以上)
可以使用它来实现动态可变长的结构体。
定义:
typedef struct FlexibleStruct { |
注意:
一个结构体中只能有一个可变长的成员,并且该成员必须是最后一个成员。
FlexibleStruct *createFlexibleStruct(int numElements) { |
要一次性分配内存
排序算法:
1.插入排序
|
2.希尔排序
它不是选择而是插入的改进
|
3.归并排序
迭代法
|
递归法
|
4.快速排序
迭代法
|
递归法
|