-
9.1 复习函数
-
函数要么执行某些特定的内容,要么找出一个值供程序使用.
-
在一个函数中的变量是属于局部变量(local variable),意思是这个变量只属于这个函数,所以在程序的其他地方定义跟这个变量的名字一样的函数是不会重名的.
-
形参:void a(int a,int b) a和b就是形参,形参也是局部变量
-
实参:实际参数是主调函数传入调用函数的值. 即主调函数吧传入的值(实参)赋值给形参
-
9.1.8 使用return从函数中返回值
-
创建一个函数之后,我们需要再创建一个main函数来检查该函数是否正常工作,该main函数通常被成为驱动程序(driver).
-
可以有多条return语句,但只能被执行一条(执行完return之后就返回上一级主调函数)例如
int max(int a,int b)
{
if(a >b)
return a;
else
return b;
}
-
栈(stack) :主调用函数将实参放入一个stack中,被调用函数从stack中读取数据并赋值到形参.
-
9.2 ANSI C 函数原型
-
旧时代的函数声明方式 int a();//ANSI C 标准之前
-
ANSI C 函数原型:type function_name (type variable,type variable2…);
-
<stdarg.h>提供定义形参数量不一定的函数的标准方法.
-
9.3 递归(recursion)
-
即在函数内调用自己
-
每一级的参数都是不一样的局部参数.
-
每一级执行结束后控制权将回到上一级递归
-
尾递归(tail recursion)
-
9.4 编译多源代码文件的程序
-
UNIX 编译命令 cc name.c name.c
-
Linux 编译命令 gcc name.c name.c
-
windows and os x 需要在项目中创建头文件和源代码.
-
在一个头文件中用#define定义常量,声明函数原型.然后在另一个.c文件中定义函数.
-
9.5 查找地址:&运算符
-
%p 地址的转换说明.
-
name 变量 &name存放name的地址.
-
函数调用的时候只传递实参,并不传递变量.
-
9.7 指针(printer)
-
编写程序时,我们认为变量有两个属性,名称和值。编译程序时,计算机也认为变量有两个属性,地址和实际参数。我们可以用&name来表示地址,用*name来表示该地址的实参。
-
间接运算符 *.
-
指针u(地址):存储指向地址的变量 u = &a;
-
*u(地址u的实际值):指向地址的实际参数 *u = a;
-
所以定义指针型变量时需要定义该变量所占的内存大小,即需要记录的地址的大小
-
更改一个*name的值,实际上就相当于更改指针name指向的变量在内存中的值.
-
如何在一个函数里更改一个指定的变量的值,例如在被调函数中更改主调函数中某个变量的值.只要吧需要改变的变量的地址赋值给指针,然后用*运算符更改即可,
#include<stdio.h>
void change(int * a)
int main(void)
{
int a = 1;
change(&a);
printf("%d",a);
retrun 0;
}
void change(int *a)
{
*a = 2;
}