函数
一个函数一个功能
不同函数的变量无法相互访问
定义和声明
- 当变量被定义的时候,编译器为变量申请内存空间并填充值
- 当变量被声明的时候,编译器就知道该变量被定义在其他地方
- 声明是通知编译器该变量名及相关的类型已存在,不需要在为此申请空间
- 局部变量既是定义又是声明
链接属性:
- external(多个文件中声明的同名标识符表示同一个实体)
- interna(单个文件声明的同名标识符表示同一个实体)
- none(声明的同名标识符被当作独立不同的实体)
- 只有具备文件作用域的标识符,才能拥有链接属性
- 使用static关键字可以使得原先拥有的external属性的标识符变为internal属性
- 使用static关键字修改链接属性,只对具有文件作用域的标识符生效
- 链接属性只能修改一次,也就是说一旦将标识符的链接属性变为internal,就无法变回external
生存期
静态存储区:文件作用域、函数(程序关闭自动释放)
自动存储区:代码块(代码块结束自动释放)
存储类型
auto(自动变量)
register(寄存器变量 )
- 将一个变量声明为寄存器变量,那么该变量就有可能被存放于CPU的寄存器中
- 寄存器变量和自动变量在很多方面的是一样的,他们都具有代码块作用域,自动存储期和空连接属性
- 将变量声明为寄存器变量,就无法通过取址运算符获取该变量的地址
static(静态局部变量:将多文件共享改变为单文件独享)
- 声明局部变量,局部变量指定为静态
- static使得局部变量具有静态存储期,所以他的生存期与全局变量一样,直到程序结束才会释放
extern
typedef(为数据类型定义别名)
全局变量:
- 如果不对全局变量进行初始化,那么他会自动初始化为0
- 在函数内部存在一个与全局变量同名的局部变量,编译器不会报错,而是屏蔽全局变量
切记:
不要大量的使用全局变量
- 占用内存高
- 污染命名空间
- 提高了程序的耦合性
作用域:
C语言可以确认的四种作用域
- 代码块作用域(形参隶属于代码块)
- 文件作用域(声明)
- 原型作用域
- 函数作用域(只适用于goto语句)
关键字extern
参数和返回值:
类型名 函数名(参数列表)
{
函数体
}
形参和实参
传值和传址
传数组:只能传进去数组首元素的地址
可变参数:
#include <stdarg.h>
-va_list//定义参数列表
-va_start//初始化参数列表
-va_arg//获取参数的值
-va_end//关闭列表
演示代码:
intlist(int n, ...)
{
int i,sum = 0;
va_list vap;
va_start(vap,n);
for(i = 0 ; i < n ; i++)
{
sum += va_arg(vap,int)
}
va_end(vap);
return sum;
}
函数指针:
函数指针-->int (*p)();
指针函数-->int *p();
使用指针变量作为函数的返回值,就是指针函数
指针演示:
函数指针演示:
函数指针作为函数
演示结果
递归函数
必须有结束条件
递归求指针:
阶乘:
快速排序:
首先寻找最中间的点,左边的从左到右寻找大于中间点的数字并标记,右边的从右向左寻找小于中间的数字并标记,将找到的两个数字进行互换位置,知道轮询完所有的数字,
演示:
void quick_sort(int array[],int left,int right);
void quick_sort(int array[],int left,int right)
{
int i=left,j=right;
int temp;
int pivot;
pivot = array[(left+right)/2];
while (i<=j) {
while (array[i]<pivot)
{
i++;
}
while (array[j]>pivot)
{
j--;
}
if(i<=j)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
{
if(left<j)
{
quick_sort(array,left,j);
}
if(i<right)
{
quick_sort(array,i,right);
}
}
}
int main()
{
int array[]={73,108,11,1181,101,10,104};
int i,length;
length=sizeof(array)/sizeof(array[0]);
quick_sort(array,0,length-1);
printf("resout:");
for(i = 0;i<length;i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
length=sizeof(array)/sizeof(array[0]);
quick_sort(array,0,length-1);
printf("resout:");
for(i = 0;i<length;i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}