iOS学习05C语言函数

本次主要是学习和理解函数,函数树状图如下:

1、函数的声明和定义 

  函数定义四要素分别为:
    返回值类型 :函数的结果值类型,函数不能返回数组。 指定返回类型是void类型说明函数没有返回值。

    函数名 :函数名命名规范和变量名命名规范一样。

    参数列表 : 每个形式参数的前面说明其类型,即使几个参数具有相同的数据类型,也必须对每个形式参数分别进行类型说明。形式参数用逗号进行分隔,就算没有参数函数后面的()也不能省略,可以写成(void)。

    函数体 :函数功能的实现。

  返回值类型 函数名(参数类型 参数名,...) {
      功能语句;
      return 返回值;
   }

  返回值

    函数的返回值称为函数的值,只能通过 return语句返回给主调函数。
    一个函数只能有一个返回值。
    函数即使没有返回值也可以使 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、函数嵌套

  C语言不允许函数嵌套定义,但是允许函数嵌套调用。
    函数嵌套定义 : 在一个函数定义内再去定义一个函数;
    函数嵌套调 : 在一个函数内去调用另一个函数。

 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声明

原文地址:https://www.cnblogs.com/gfxxbk/p/5257329.html