zoukankan      html  css  js  c++  java
  • C 语言 static、extern与指针函数介绍

    1.exit(0)正常退出程序

       exit(1)程序异常时退出程序

    2.static(静态变量)修饰局部变量

      在局部变量使用static修饰,会延长局部变量的存在期。但我们需要注意一下几点:

    • 虽然static修饰变量的生存期很长,但它始终是局部变量,不能在其他函数中使用
    • static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
            全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,  静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,  当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,  在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,  因此可以避免在其它源文件中引起错误。
           从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
           static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
           static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
           static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
           static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

    3.extern(外部变量)  修饰全局变量

           extern 不但可以修饰变量还可以修饰函数

    全局变量范围已经很广了,为什么还要用extern来修饰呢?看下面一个例子

    #include "stdio.h"

    void main()

    {

          extern        a;

          extern        b;

          printf("a=%d,b=%d",a,b);  

    }

    int a=13,b=5;

    上面例子中,在定义了a,b之前就使用它,也就是说extern扩展了全局变量的作用范围。

    extern不仅上边例子这种用法,在不同文件中的全局变量也可以使用extern来使用。

    4.指针函数

           定义:指针函数就是函数类型和返回值都是指针的函数。

    指针函数的一般形式:

                  类型 *函数名(参数列表)

    下面用一个例子来体会一下指针函数的妙用吧

    /* Note:Your choice is C IDE */

    #include "stdio.h"

    char * SubString(char s[],int i,int j);

    char *SubString1(char s[] ,char temp[], int i,int j);

    void main()

    char string[]="I Love C Language"; 

    char *ps=NULL;

    char temp[100];

    ps=SubString(string,2,9); 

    printf("%s ",ps);  

    SubString1(string,temp,2,9);

    printf("%s ",temp);

    }

    char * SubString(char s[],int i,int j)

    {

       static char temp[100];/*这个地方声明的临时数组必须为static,否则值传不会去*/

    int m,n;

    for(m=0,n=i;n<=j;m++,n++)

    {

    temp[m]=s[n];

    }

    temp[m]='';

    return temp;

    }

    char *SubString1(char s[] ,char temp[], int i,int j)

    {

    int m,n;

    for(m=0,n=i;n<=j;m++,n++)

    {

    temp[m]=s[n];

    }

    temp[m]='';

    }

  • 相关阅读:
    Java和Flex积分误差(一个)
    分组统计查询(本章小结)
    crm使用soap删除实体
    宁可信其有,谎言重复千遍就会成为真理,性格可以被改变
    意想不到的一天,无法逃出的肖申克
    测试使用wiz来发布blog
    2013年7月4日星期四
    2013年7月3日星期三
    2013年7月2日星期二
    2013年7月1日星期一
  • 原文地址:https://www.cnblogs.com/smiler/p/3462714.html
Copyright © 2011-2022 走看看