zoukankan      html  css  js  c++  java
  • IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数
    --------------------------------------------
     qq交流群:创梦技术交流群:251572072
                           创梦网络赚钱群:248318056
                           创梦娱乐休闲群:224801824
     教程下载,在线交流:创梦IT社区:www.credream.com
     网络赚钱,营销学习:创梦网赚:www.cremoney.tk
     休闲娱乐,在线影视:创梦影视:www.cremovie.tk
     -----------------------------------------------------
    0 6.C语言4-函数
    ---------------------------------
    一、函数的分类
    1.主函数,也就是main函数。每个程序中只能有一个、也必须有一个主函数。无论主函数写在什么位置,C程序总是从主函数开始执行
    2.开发人员自定义的函数,可有可无,数目不限
    3.C语言提供的库函数,例如stdio.h中的输出函数printf()和输入函数scanf()
    --------------------------------------------------------------------------------
    二、函数的声明和定义
        虽说C中的函数类似于Java中的方法,但在使用上还是有区别的。
    1.在Java中,每个方法的定义顺序没有限制,在前面定义的方法内部可以调用后面定义的方法
      public void test() {
         int c = sum(1, 4);
     }
     
      public int sum(int a, int b) {
         return a + b;
     }
    第1行定义的test方法可以调用在第5行定义的sum方法
    ----------------------------------------
    2.在标准C语言中,函数的定义顺序是有讲究的,默认情况下,只有后面定义的函数才可以调用前面定义过的函数
      int sum(int a, int b) {
         return a + b;
     }
     
     int main()
     {
         int c = sum(1, 4);
         return 0;
     }
    ------------------------------------------------
    第5行定义的main函数调用了第1行的sum函数,这是合法的。
    如果调换下sum函数和main函数的顺序,在标准的C编译器环境下是不合法的
    (不过在Xcode中只是警告,Xcode中用的是GCC编译器)
    ------------------------------------------------------------------------------
    3.如果想把其他函数的定义写在main函数后面,而且main函数能正常调用这些函数,
      那就必须在main函数前面作一下函数的声明
      // 只是做个函数声明,并不用实现
     int sum(int a, int b);
     //注意这里定义的时候,也可以这样
     //int sum(int ,int)仅仅指定参数的类型就可以
     int main()
     {
         int c = sum(1, 4);
         return 0;
     }
     
     // 函数的定义(实现)
     int sum(int a, int b) {
         return a + b;
     }
     -------------------------------------------------------------------------------------
     我们在第2行做了sum函数的声明,然后在第6行(main函数中)就可以正常调用sum函数了。
     -------------------------------------------------------------------------------------------
    1.函数的声明格式:
    返回值类型  函数名 (参数1, 参数2, ...)
    可以省略参数名称,比如上面的sum函数声明可以写成这样:
    int sum(int, int);
    只要你在main函数前面声明过一个函数,main函数就知道这个函数的存在,就可以调用这个函数。
    究竟这个函数是做什么用,还要看函数的定义。如果只有函数的声明,而没有函数的定义,那么程序将会在链接时出错。
    ----------------------------------------------------------------------------------------------------------------
    4.在大型的C程序中,为了分模块进行开发,一般会将函数的声明和定义(即实现)分别放在2个文件中,
      函数声明放在.h头文件中,函数定义放在.c源文件中
      a.下面我们将sum函数的声明和定义分别放在sum.h和sum.c中
         sum.h文件
         其实sum.h和sum.c的文件名不一样要相同,可以随便写,只要文件名是合法的
         用到的时候,需要用#include ""把需要的声明和实现包含进来.
      sum.h文件:
      int sum(int a, int b)
      sum.c文件:
       // 函数的定义(实现)
     int sum(int a, int b) {
         return a + b;
     }
     main.c文件:
     #include "sum.h"
     void main(){
     
     }
    ----------------------------------------------------------------------------------
     b.运行步骤分析:
       1> 在编译之前,预编译器会将sum.h文件中的内容拷贝到main.c中
       2> 接着编译main.c和sum.c两个源文件,生成目标文件main.obj和sum.obj,
          这2个文件是不能被单独执行的,原因很简单:
          sum.obj中不存在main函数,肯定不可以被执行
       * main.obj中虽然有main函数,但是它在main函数中调用了一个sum函数,
         而sum函数的定义却存在于sum.obj中,因此main.obj依赖于sum.obj
       3> 把main.obj、sum.obj链接在一起,生成可执行文件
       4> 运行程序
    -----------------------------------------------------------------------------------------------------
    5.可不可以在main.c中包含sum.c文件,不要sum.h文件了?]
      大家都知道#include的功能是拷贝内容,因此上面的代码等效于:
      这么一看,语法上是绝对没有问题的,但是绝对运行不起来,在链接时会出错。
      原因:编译器会编译所有的.c源文件,这里包括main.c、sum.c,编译成功后生成sum.obj、main.obj文件,
      当链接这两个文件时链接器会发现sum.obj和main.obj里面都有sum函数的定义,于是报"标识符重复"的错误。
     -----------------------------------------------------------------------------------------------------------
     有人可能觉得分出sum.h和sum.c文件的这种做法好傻B,好端端多出2个文件,
     你把所有的东西都写到main.c不就可以了么?
    •没错,整个C程序的代码是可以都写在main.c中。但是,如果项目做得很大,
     你可以想象得到,main.c这个文件会有多么庞大,会严重降低开发和调试效率。
    •要想出色地完成一个大项目,需要一个团队的合作,不是一个人就可以搞的定的。
     如果把所有的代码都写在main.c中,那就导致代码冲突,因为整个团队的开发人员都在修改main.c文件,
     张三修改的代码很有可能会抹掉李四之前添加的代码。
    •正常的模式应该是这样:假设张三负责编写main函数,李四负责编写一系列的自定义函数,
     张三需要用到李四编写的某个函数,怎么办呢?李四可以将所有的函数声明在一个.h文件中,
     比如lisi.h,然后张三在他自己的代码中包含lisi.h文件,接着就可以调用lisi.h中声明的函数了,
     而李四呢,可以独立地在另外一个文件中(比如lisi.c)编写函数的定义,实现那些在lisi.h中声明的函数。
     这样子,张三和李四就可以相互协作、不会冲突。
    ---------------------------------------------------------------------------------------------------------------
    7.注意:
      如果代码中存在重复定义的情况
      比如写了两个:
      #include <stdio.h>
      #include <stdio.h>
      这样写是没有问题的,因为c语言有一个检查机制,会忽略重复的代码
      这里检查机制,用到了宏指令
     ---------------------------------------------------------
    2013/8/7
    注意如果在xcode中查看错误:
    需要点击左侧的叹号符号:
    ----------------------------
    1.注意编译器编译的时候不会编译头文件也就是.h文件,.h文件只是用来提供包含的
    ------------------------------------------------------
    2.注意在上一部中,深层分析,不可以将sum.c直接包含到main.c里的原因:
      因为链接,是吧所有有关联的obj文件,和库函数链接在一起,如果这样的话
      ,那么链接的时候会把sum.c和main.c链接到一起,那么这两个文件中都
      有sum.c中定义的sum方法,所以就会报函数重复的错误.
    -----------------------------------------------------------
    3.这个错误,在编译的时候是不会报的因为编译是针对的每个.c文件,
      而sum.c和main.c中都只有一根sum函数,所以编译不会报错,而在
      链接的时候报错.
    -----------------------------------------
    4.所以可以看出,在包含的时候,只需要包含.h文件就行了,因为链接的时候
      会自动的把相关的.obj文件链接起来.这样就没有错误了.
    ----------------------------------------------------
    5.面向对象和面向过程的区别,因为java是面向对象的,不以方法为中心,所以不同文件
      中可以由多个相同的函数.
     b.在c中是以过程为中心的,所以在c中,过程是不能重复的.像上面的例子一样
        就在链接的时候报了错.
    -------------------------------------------------------
    三、函数的形参和实参
    1.在定义函数时,函数名后面的()中定义的变量称为形式参数(形参);
      在调用函数时传入的值称为实际参数(实参)。
    -------------------------------------------
    2.// b是test函数的形参(形式参数)
    void test(int b)
    {
        b = 9; // 改变了形参b的值
    }

    int main()
    {
        int a = 10;
        printf("函数调用前的a:%d ", a);
       
        test(a); // a是test函数的实参(实际参数)

        printf("函数调用后的a:%d", a);
        return 0;
    }
    ----------------------------------------------
    3.如果是基本数据类型作为函数的形参,那是简单的值传递,将实参a的值赋
     值给了形参b,相当于
    4.int a = 10;
      int b = a;
      b = 9;
      a和b是分别有着不同内存地址的2个变量,因此改变了形参b的值,
      并不会影响实参a的值。
    ----------------------------------------------------------------
    int a = 10;
    int b = a;
    b = 9;
    a和b是分别有着不同内存地址的2个变量,
    因此改变了形参b的值,并不会影响实参a的值。
    -----------------------------------------------------
    1.函数学习中用到的代码
    /*  HELLO.C -- Hello, world */

    //#include "stdio.h"
    #include "stdio.h"
    //#include "conio.h"
        // 在c语言中,是不可以在main函数中调用,没有在main函数之前定义的函数的,
        //这个和编译器有关,因为编译器是从上往下编译的,编译后,当main()函数中
        //调用了,在main函数之前没有定义的函数的时候,相当于编译器找不到该函数
        //编译器就会报错,解决方法很简单,把要使用的方法,在main函数之前先声明,然后在用到
        //的地方进行实现
        void test();

    int main()
    {
        printf("Hello, world ");
        test(); //调用第一个函数
    int c= sum(10,3); //调用第二个函数
        getch();
    printf("sum的结果是: %d" ,c);
    return 0;
    }


    //"定义",也就是实现test函数
    void test(){
    printf("调用了test函数 ");
    //这里注意,凡事用到了系统的中的函数就要引用头文件#include<stdio.h>
    }

    //定义一个函数,用来计算2个整数的和
    int sum(int a,int b){
    int c=a+b
    //10+3=13
    printf("%d +%d =%d ",a,b,c)
    return c;
    }
    2013/8/7
    ---------

  • 相关阅读:
    Handlebars模板引擎简单使用
    SpringMVC学习笔记001-服务器端获取JSON字符串并解析
    EL表达式的使用
    SpringMVC学习笔记001
    ExtJS学习之路碎碎念
    Microsoft Word 使用技巧总结
    驼峰命名法
    视图生命周期
    git命令
    git的使用1[转]
  • 原文地址:https://www.cnblogs.com/pangblog/p/3271533.html
Copyright © 2011-2022 走看看