zoukankan      html  css  js  c++  java
  • c 变量的存储类型auto等(基础知识)和c函数变量

    总结 

    1).在c语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。

    2). 对数据型(如整型、字符型等)。存储类别指的是数据在内存中存储的方式。

    存储方式分为两大类:

    静态存储类和动态存储类

    具体包括四种:{自动的(auto), 静态的(static), 寄存器(register), 外部的(extern)}。 根据变量的存储类别, 可以知道变量的作用域和生存期。

    一个程序在编译运行的时候, 普通变量是存放在栈里面的
    而static会是的变量存放在data里
    整个内存主要分为四大区:   CODE(代码), DATA(数据区,变量常量等), STACK(栈), HEAP(程序员定义)

    例如:

    局部变量:

    自动变量: int main(void){int a, b, c; 自动变量}

    静态局部变量: int main(void){static int a, b, c; }  离开函数, 值仍保留

    寄存器变量:int main(void){register int a, b, c; } 

    --------------------------

    全局变量:

    静态外部变量: static int A;

    外部变量: int A ;

    静态存储
    
        {  静态局部变量(函数内有效),
         静态外部变量(本文件内有效),
         外部变量 (其他文件可引用)
        }

    注意: 

    静态存储是放在data段, 而动态存储是放在栈里面的

    --------------------------------------------

    auto变量

    函数中的局部变量, 如不专门声明为static存储类别, 都是动态地分配存储空间的(栈), 数据存储在动态存储区中

    函数中的形参和函数中定义的变量(包括符合语句中的变量), 都属于类, 调用该函数时系统

    会给他们分配存储空间, 在函数结束时, 就会自动释放这些存储空间

    默认可以不写auto

    static声明局部变量

    函数中的局部变量的值在函数调用结束后不消失而保留原值, 即其占用的存储单元不释放, 

    在下一次该函数调用时, 该变量已有值, 就是上一次函数调用结束时的值。

    用static进行声明

    #include<stdio.h>
    
    int f(int a)
    {
          auto int b=0;
          static int c=3;
    
           b = b+1;   // b== 1, 1, 1
           c = c+1; // c==4, 5, 6
           return (a+b+c)
    }
    
    void main()
    {
            int a=2, i;
            for(i=0;i<3;i++)
            {
                printf("%d
    ", f(a));
            }
    }

    栈有个特点:

    调用的时候会生成一个栈,用完回收。

    而静态则不会释放, 对静态局部变量是在编译时赋初始值, 即只赋初值一次, 在程序运行时他已有值。

    register变量

    如果有一些变量使用频繁(例如一个函数循环中,每次循环都要引用某局部变量, 则为存取变量的值要花费不少时间)。 

    为提高执行效率, c语言允许将局部变量的值放在cpu中的寄存器中, 需要用时直接从

    寄存器中参加运算, 不必再到内存中去存取。

    #include<stdio.h>
    int fac(int n)
    {
        register int i, f=1;
        for(i=1; i<=n; i++)
        {
                f *= 1;
        }
        return (f);
    }
    void main()
    {
            int i;
            for (i=1;i<=15;i++)
            {
                printf("%d! = %d
    ", i fac(i))
            }
    }

    extern 声明外部变量(全局)

    外部变量即全局变量, 它的作用域是从变量的定义处开始,到本程序文件的末尾。

    在此作用域内, 全局变量可以为程序中的各个函数所引用。编译时将外部变量分配在

    静态存储区。

    有时需要用extern来声明外部变量, 以扩展外部变量的作用域。

    #include <stdio.h>
    
    int max(int x, int y)
    {
        int z;
        z = x > y ? x : y;
        return (z);
    }
    
    int main(void)
    {
        extern A, B;
        printf("%d
    ", max(A, b));
    }
    
    int A = 13, B = -8;

     函数变量

    1.c

    #include <stdio.h>
    
    int A;    /×定义外部变量×/  --- 创建存储空间
    
    int main(void)
    {
         int power(int );      /× 函数声明×/
    }

    2.c

    extern  A;  /×声明A为一个已定义的外部变量×/  --注意这里不建立存储空间,成为引用性声明
    
    int power(int n)
    {
    。。。。。
    }

    用static声明外部变量--本文件使用

    需求:

    有时在程序设计中希望某些外部变量只限于被本文件引用, 而不能被其他文件引用。这时可以在

    定义外部变量时加一个static声明。 

    # include<stdio.h>
    
    static int A;  /*这里定义声明为static, 不让别的文件引用*/
    
    int main(void)
    {
    ....
    }

    那么下面这个extern A就拿不动A的值,可以理解为私有_A

    extern  A;  /×声明A为一个已定义的外部变量×/
    
    int power(int n)
    {
    。。。。。
    }

    关于变量的声明和定义

    对变量而言, 声明和定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:一种是需要

    建立存储空间的(如: int a;)另一种是不需要建立存储空间的(如:extern a;)

    前者是定义性声明, 简称定义, 后者成为引用性声明。

  • 相关阅读:
    从Mysql中取出数据并用jieba统计词频
    关于important的用法
    Spring boot主启动类探究
    PHPMyadmin 配置多个网段
    Perl 对json的过滤脚本
    Perl 校验命中的脚本
    web渗透测试工具—Fiddler(转)
    PerlIde in NetBeans7.3 for Debian
    Perl last和next的用法区别
    2020.7.25
  • 原文地址:https://www.cnblogs.com/renfanzi/p/6719474.html
Copyright © 2011-2022 走看看