1、
static静态修饰符
static全局变量和普通全局变量区别
static全局变量只能在本文件中使用,普通全局变量可以在一个项目下的所有文件中使用,需要加extern。static全局变量只能初始化一次
static局部变量和普通局部变量区别:
static局部变量只能初始化一次
如:
while(i-- <3)
{
static int j = 0
j++; //第一次循环j==1,第二次j==2,第三次j==3
}
static函数和普通函数区别:
static函数只能在本文件使用
普通函数可以在其他文件调用,但需要在文件中加入包含这个函数申明的头文件。或者直接在文件全局处申明这个其他文件的函数,然后就可以在这个文件中调用这个函数了
2、
内联函数
内联函数的定义与调用该函数的代码必须在同一文件中,如果有多个文件需要使用某个内联函数,一般将内联函数定义在头文件中。头文件一般只放函数声明,但内联函数是例外,需要在头文件定义
# include<stdio.h>
inline static void eatline()
{
printf(“haha”);
}
int main(void)
{
eatline(); //调用内联函数
}
函数式宏一般没有return返回值,内联函数可以有return返回值
3、
快速排序函数qsort()
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))
第一元素是数组首元素地址
第二个元素是数组长度
第三个元素是每个元素字节大小
第四个元素传入一个比较函数的函数地址
如对一个double的数组从小到大排序
int compar(const void *p1, const void *p2)
{
const double * a1 = (const double *)p1; //必须强转
const double *a2 = (const double *)p2;
if(*a1 < *a2)
return -1;
else if (*a1 == *a2)
return 0;
else
return 1;
}
4、
线性结构:数组(连续存储)、链表(离散存储)
线性结构常见应用:栈和队列
非线性结构:树和图
查找:折半查找
排序:冒泡、插入、选择、快排、归并
5、
宏函数
#include <stdio.h>
#define SUM(n) do { \
int sum = 0; \
while (n > 0) { \
sum = sum + n; \
n--; \
} \
printf("前n项和为:%d\n", sum); \
} while (0)
int main(void)
{
int n = 5;
SUM(n); //15
return 0;
}
宏函数的执行步骤是先把变量或者常量替换了,然后放到主函数里,这里n是变量,第一步替换:
do {
int sum = 0;
while (n > 0) {
sum = sum + n;
n--;
}
printf("前n项和为:%d\n", sum);
} while (0)
第二步放到主函数:
int main(void)
{
int n = 5;
do {
int sum = 0;
while (n > 0) {
sum = sum + n;
n--; //n是个变量可以自减操作,刚开始为5
}
printf("前n项和为:%d\n", sum);
} while (0);
return 0;
}
如果在主函数直接给宏函数赋常量,如SUM(5);则会报错,第一步替换:
do {
int sum = 0;
while (5 > 0) {
sum = sum + 5;
5--; //5 = 5-1; error常量是不能修改的左值,可在刚开始定义一个变量,如int i = n; 后面用i计数和自减就不会报错
}
printf("前n项和为:%d\n", sum);
} while (0)