本次主要是学习和理解函数,函数树状图如下:
1、函数的声明和定义
返回值类型 :函数的结果值类型,函数不能返回数组。 指定返回类型是void类型说明函数没有返回值。
函数名 :函数名命名规范和变量名命名规范一样。
参数列表 : 每个形式参数的前面说明其类型,即使几个参数具有相同的数据类型,也必须对每个形式参数分别进行类型说明。形式参数用逗号进行分隔,就算没有参数函数后面的()也不能省略,可以写成(void)。
函数体 :函数功能的实现。
返回值类型 函数名(参数类型 参数名,...) {
功能语句;
return 返回值;
}
返回值
一个函数只能有一个返回值。
return后面的语句不再执行。
1 void test() { 2 printf("我在return语句之前"); 3 return; 4 printf("我在return语句之后");//不执行 5 }
函数声明
函数声明:指的就是函数的描述,也叫函数原型。
函数声明:
1、函数定义出现在主调函数之前,可以省略函数声明。
2、函数定义出现在主调函数之后,需要提前声明函数。
函数声明尽管可以省略,从规范来讲,不要省略。
1 // 1.函数声明 2 int maxValue(int, int); 3 // 2.函数定义 4 int maxValue(int a, int b) { 5 return a > b ? a : b; 6 }
2、函数分类
库函数(系统提供好的函数,例如printf)
printf(“Hello Lanou ”); scanf(“%d”, &number); strlen(string); strcpy(string1, sthring2);
...
printf 输出函数, 用于输出一个信息
scanf 输入函数,用于从键盘输入一个信息
strlen 求字符串长度函数,用于求指定字符串的长度
strcpy 字符串拷贝函数,用于实现字符串复制
...
自定义函数(开发者自己写的函数)
void sayHello() { printf("hello, 约吗?"); }
1 void printSum(int a, int b) { 2 int sum = a + b; 3 printf("sum = %d ", sum); 4 }
int randomValue() { return arc4random() % 11; }
1 int mulValue(int a, int b) { 2 int mul = a * b; 3 return mul; 4 }
3、函数调用
函数名();
对上面函数的调用
1 sayHello(); 2 printSum(2, 3); 3 4 int random = randomValue(); 5 printf("random = %d ", random); 6 7 int mul = mulValue(2, 3); 8 printf("mul = %d ", mul);
4、形参实参
形参:形式上的参数,函数定义时使用的参数,以假名字来表示函数调用时需要提供的值,作用范围为整个函数范围。
实参:函数调用的时候传过去的参数值,出现在函数调用中的表达式。
5、函数嵌套
6、数组作为参数传递
数组作为参数是按地址传递的
数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名。形参 数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
1 // 定义函数,打印数组中所有的元素 2 void printArray(int a[], int count) { 3 for (int i = 0; i < count; i++) { 4 printf("%d ", a[i]); 5 } 6 } 7 int main(int argc, const char * argv[]) { 8 9 // 数组作为函数参数 10 // 数组名是数组元素首地址 11 12 int array[] = {2, 4, 1, 5, 6, 8}; 13 int count = sizeof(array) / sizeof(int); 14 15 printArray(array, count); 16 17 return 0; 18 }
7、作用域
变量作用域决定了变量的使用范围
局部变量
在函数内部定义的变量称为局部变量
作用域:从定义开始,到 ' } ' 结束
不同的函数中可以定义相同的变量,因为作用域不同
全局变量
在函数外部定义的变量称为全局变量
作用域:从定义位置开始,到文件结束
定义在主函数中,在其他.m文件中使用时,需要使用extern声明