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

1、函数的声明和定义 

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

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

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

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

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

  返回值

    函数的返回值称为函数的值,只能通过 return语句返回给主调函数。
    一个函数只能有一个返回值。
    函数即使没有返回值也可以使 return来结束函数的执行
,回到主调函数。

    return后面的语句不再执行。      

     void test() {
    printf("我在return语句之前");
    return;
    printf("我在return语句之后");//不执行
    }

  函数声明   

    严格的函数通常包括三部分: 函数声明、函数定义、以及函数调用。

    函数声明:指的就是函数的描述,也叫函数原型。

       函数声明:

      1、函数定义出现在主调函数之前,可以省略函数声明。

      2、函数定义出现在主调函数之后,需要提前声明函数。

    函数声明尽管可以省略,从规范来讲,不要省略。
     // 1.函数声明
    int maxValue(int, int);
    // 2.函数定义
    int maxValue(int a, int b) {
    return a > b ? a : b;
    }

2、函数分类

  从函数定义上来看,函数可分为:

    库函数(系统提供好的函数,例如printf) 

      printf(“Hello Lanou\n”);
  scanf(“%d”, &number);
  strlen(string);
  strcpy(string1, sthring2);
     ...

    printf 输出函数, 用于输出一个信息

    scanf 输入函数,用于从键盘输入一个信息

    strlen 求字符串长度函数,用于求指定字符串的长度

    strcpy 字符串拷贝函数,用于实现字符串复制

    ...  

    自定义函数(开发者自己写的函数)

  从函数定义上来看,函数可分为:
    第一种 无参无返回值 

        void sayHello() {
    printf("hello, 约吗?");
    }
    第二种 无返回值 有参   

       void printSum(int a, int b) {
  int sum = a + b;
  printf("sum = %d\n", sum);
  }
    第三种 有返回值,无参
      int randomValue() {
      return arc4random() % ;
      }
    第四种 有返回值,有参    

     int mulValue(int a, int b) {
int mul = a * b;
return mul;
}

3、函数调用

  函数调用由函数名和跟随其后的实际参数列表组成,其中实际参数列表用(...)括起来。函数调用后边始终跟着分号, 即使没有参数也要加上()。 

    函数名();

  函数的调用, 会产生程序的跳转。

     对上面函数的调用  

       sayHello();
  printSum(, );   int random = randomValue();
  printf("random = %d\n", random);   int mul = mulValue(, );
  printf("mul = %d\n", mul);

4、形参实参

  形参:形式上的参数,函数定义时使用的参数,以假名字来表示函数调用时需要提供的值,作用范围为整个函数范围。
  实参:函数调用的时候传过去的参数值,出现在函数调用中的表达式。

  注意函数调用中,形参会拷贝实参内容,传递参数是给函数传送信息的一种方法。

5、函数嵌套

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

6、数组作为参数传递

  数组作为参数是按地址传递的
      数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名。形参  数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

 // 定义函数,打印数组中所有的元素
void printArray(int a[], int count) {
for (int i = ; i < count; i++) {
printf("%d\n", a[i]);
}
}
int main(int argc, const char * argv[]) { // 数组作为函数参数
// 数组名是数组元素首地址 int array[] = {, , , , , };
int count = sizeof(array) / sizeof(int); printArray(array, count); return ;
}

7、作用域

  变量作用域决定了变量的使用范围

  局部变量
    在函数内部定义的变量称为局部变量
    作用域:从定义开始,到 ' } ' 结束
    不同的函数中可以定义相同的变量,因为作用域不同
  全局变量
    在函数外部定义的变量称为全局变量
    作用域:从定义位置开始,到文件结束

    定义在主函数中,在其他.m文件中使用时,需要使用extern声明

iOS学习05C语言函数的更多相关文章

  1. iOS学习09C语言函数指针

    本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...

  2. C语言基础:函数指针 分类: iOS学习 c语言基础 2015-06-10 21:55 15人阅读 评论(0) 收藏

    函数指针:指向函数的指针变量. 函数名相当于首地址. 函数指针定义:返回值类型  (*函数指针变量名)(参数类型1,参数类型2,....)=初始值 函数指针类型:返回值类型  (*)(参数类型1,参数 ...

  3. C语言基础:函数(Function) 分类: iOS学习 c语言基础 2015-06-10 21:48 14人阅读 评论(0) 收藏

    函数:一段具有某些特定功能的代码段. 使用函数的严格规定: 1.函数声明 2.函数定义 3.函数调用 函数声明:告知系统编译器该系统的函数名,函数参数,参数类型,参数个数,参数顺序等等,以便函数调用时 ...

  4. C语言基础总结 分类: iOS学习 c语言基础 2015-06-11 10:08 23人阅读 评论(0) 收藏

    //欲练此功必先自宫!!!     //第一天:C语言的基础     //进制     //2进制, 10进制, 8进制, 16进制     //注:8进制数前加0, 16进制数前加0x        ...

  5. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  6. iOS学习06C语言结构体

    1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...

  7. iOS学习04C语言数组

    1.一维数组 数组:具有相同类型的成员组成的一组数据 1> 定义 元素:数组中存放的数据成为数组的元素     数组是构造类型,用{...}来给构造类型赋初始值,类型修饰符用来表示元素的类型 类 ...

  8. iOS学习02C语言分支结构

    1. BOOL类型 返回值:真:YES  假:NO BOOL数据类型占一个字节的内存空间,占位符为%d. 计算机在识别时,YES就替换成1,NO就替换成0. bool是C语言中的布尔类型,返回值为tr ...

  9. C语言基础:数组 分类: iOS学习 c语言基础 2015-06-10 21:40 7人阅读 评论(0) 收藏

    数组:是由一组具有相同数据类型的数据组合而来. 数组定义:元素类型修饰符 数组名[数组个数]={元素1,元素2....};  int arr[ 2 ]={1,2};    //正确 int arr[ ...

随机推荐

  1. Mysql事务隔离级别

    在说Isolation之前,需要谈谈关系型数据库的ACID特性. A(atomicity,原子性),指一个事务要么完全完成,要么全部回滚到起始状态,不存在中间状态. C(Consistency,一致性 ...

  2. fork与vfork的区别与联系

    fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 2. fo ...

  3. sql学习笔记--存储过程

    存储过程(stored procedure)有时也称sproc,它是真正的脚本,更准确地说,它是批处理(batch),但都不是很确切,它存储与数据库而不是单独的文件中. 存储过程中有输入参数,输出参数 ...

  4. HTML5 – 2.新元素

    figcaption 定义和用法 <figcaption> 标签定义 figure 元素的标题(caption). "figcaption" 元素应该被置于 " ...

  5. CNN初步-1

    Convolution:   个特征,则这时候把输入层的所有点都与隐含层节点连接,则需要学习10^6个参数,这样的话在使用BP算法时速度就明显慢了很多. 所以后面就发展到了局部连接网络,也就是说每个隐 ...

  6. SQL链表查询 数据库为空

    查询出数据为空,解决方案:链表 对应字段长度不一致.

  7. 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制

    五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...

  8. protobuf-net 对象二进制序列化与反序列号(转)

    概述: Protobuf是google开源的一个项目,用户数据序列化反序列化,google声称google的数据通信都是用该序列化方法.它比xml格式要少的多,甚至比二进制数据格式也小的多. Prot ...

  9. Dwz下拉菜单的二级联动

    在DWZ文档中对组合框combox的是这样描述的: 在传统的select 用class 定义:class=”combox”, html 扩展:保留原有属性name,  增加了属性:ref. ref 属 ...

  10. Vijos P1459 车展 treap求任意区间中位数

    描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i].主管已 ...