博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c 变量的存储类型auto等(基础知识)和c函数变量
阅读量:6908 次
发布时间:2019-06-27

本文共 2545 字,大约阅读时间需要 8 分钟。

总结 

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
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\n", f(a)); }}

 

栈有个特点:

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

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

 

register变量

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

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

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

#include
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\n", i fac(i)) }}

 

extern 声明外部变量(全局)

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

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

静态存储区。

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

 

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

 函数变量

1.c

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

2.c

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

 

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

需求:

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

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

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

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

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

 

关于变量的声明和定义

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

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

 

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

 

转载地址:http://nfgdl.baihongyu.com/

你可能感兴趣的文章
sqlserver 的事务和c#的事务
查看>>
kernelchina.org内核研究
查看>>
模拟Asp.Net Forums实现可以换皮肤的控件 (转载)
查看>>
python使用(一)
查看>>
认真分析mmap:是什么 为什么 怎么用【转】
查看>>
ios 上拉载入下拉刷新Dome
查看>>
Objective-C:NSMutableString类的常见操作
查看>>
用javascript操作xml
查看>>
突破Windows系统默认用户句柄与GDI句柄限制
查看>>
SQLServer 2016安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本
查看>>
光流定位原理是什么??【转】
查看>>
POJ 2778 DNA Sequence (AC自己主动机 + dp)
查看>>
JS排序的运用
查看>>
堆排序
查看>>
uC/OS-II源码分析(一)
查看>>
Redis自学笔记 --string类型
查看>>
【c++】动态绑定
查看>>
WCF NetTcpBinding Transport安全模式(8) ClientCredentialType证书验证模式---- PeerOrChainTrust验证模式...
查看>>
A.4.1-类的继承(implement)
查看>>
Nginx中防盗链(下载防盗链和图片防盗链)及图片访问地址操作记录
查看>>