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=;
static int c=; b = b+; // b== 1, 1, 1
c = c+; // c==4, 5, 6
return (a+b+c)
} void main()
{
int a=, i;
for(i=;i<;i++)
{
printf("%d\n", f(a));
}
}
栈有个特点:
调用的时候会生成一个栈,用完回收。
而静态则不会释放, 对静态局部变量是在编译时赋初始值, 即只赋初值一次, 在程序运行时他已有值。
register变量
如果有一些变量使用频繁(例如一个函数循环中,每次循环都要引用某局部变量, 则为存取变量的值要花费不少时间)。
为提高执行效率, c语言允许将局部变量的值放在cpu中的寄存器中, 需要用时直接从
寄存器中参加运算, 不必再到内存中去存取。
#include<stdio.h>
int fac(int n)
{
register int i, f=;
for(i=; i<=n; i++)
{
f *= ;
}
return (f);
}
void main()
{
int i;
for (i=;i<=;i++)
{
printf("%d! = %d\n", 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\n", max(A, b));
} int A = , B = -;
函数变量
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;)
前者是定义性声明, 简称定义, 后者成为引用性声明。
c 变量的存储类型auto等(基础知识)和c函数变量的更多相关文章
- (C/C++学习笔记) 九. 变量的存储类型
九. 变量的存储类型 ● 变量的存储类型(见附页) ● 注释 ①对于自动变量,它属于动态存储方式. 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个 ...
- C语言中变量的存储类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...
- C06 变量和存储类型
目录 全局变量 局部变量 存储类型 全局变量和局部变量 变量的作用域 作用域:某些事物起作用或有效的区域. 变量的使用范围称为变量的作用域. 变量的作用域决定了变量的可操作性和有效性. C语言变量的作 ...
- C++变量的存储类型
C++变量和函数包括两个属性:数据类型和数据的存储类型.存储类型是指数据在内存中存储的方式.变量的存储类型分为四种:自动类型(auto),寄存器类型(register).静态类型(static)外部类 ...
- 01-Java基础知识:数据类型与变量、标识符、运算符、表达式
Java基础知识:数据类型与变量.标识符.运算符.表达式 一.数据类型 Java定义了基本数据类型.引用数据类型.自定义类型. 八种基本数据类型:byte (1). short (2). int ( ...
- C和指针 第三章 变量的储存类型 auto、static、register以及static关键词
变量的储存类型决定标量何时创建,何时销毁以及他的值保持多久.有三个地方可以储存变量: 普通内存static 运行时堆栈auto 硬件寄存器register 变量的缺省储存类型取决于它的声明位置: 静态 ...
- 存储类型auto,static,extern,register的区别 <转>
变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种. 内存中.具体点来说内存分为三块:静态区,堆 ...
- C++基础知识篇:C++ 变量类型
变量其实只不过是程序可操作的存储区的名称.C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和下划线字 ...
- js基础知识之_入门变量和运算符
js页面效果学习 (轮播图,文字滚动效果等等) javascript能来做什么 1.数据验证 2.将动态的内容写入网页中(ajax) 3.可以对时间做出响应 4.可以读写html中的内容 5.可以检测 ...
随机推荐
- Xcode6中添加pch文件
转自:http://www.cnblogs.com/YouXianMing/p/3989155.html 1. 新建工程: 2. 创建pch文件: 3. 在setting里面进行设置: 4. 一切尽在 ...
- WCF学习分享2
整个solution结构例如以下: 以下介绍每一个project: 1. Service.Interface 定义契约 ICalculator.cs watermark/2/text/aHR0cDov ...
- SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
首先,我们创建一些测试数据. if OBJECT_ID('Tempdb.dbo.#Tmp') is not null drop table #Tmp create table #Tmp ( name ...
- 每天一个linux命令(6):dos2unix unix2dos
dos2unix是将Windows格式文件转换为Unix.Linux格式的实用命令.Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2unix命令 ...
- python管道pipe
1.什么是管道 Linux进程间通信方式的一种,管道有两端,读端和写端.创建管道,然后从父进程fork出子进程, 父进程和子进程拥有共同的读写文件描述符,可以实现子进程写文件,父进程读文件的操作. 示 ...
- 【编码】Base64编码
简述 为什么叫Base64?个人理解是,基础的64个字符. 而它的作用?用基础的(可理解为可安全传输的)64个字符,来表示难以表示的二进制或对程序造成干扰的字符. Base64的编码过程 自行编码分析 ...
- 【Miktex】使用教程以及数学符号整理总结
LaTeX是当今世界上最流行和使用最为广泛的 TeX格式.它构筑在 Plain TeX的基础之上,并加进了很多的功能以使得使用者可以更为方便的利用 TeX的强大功能.使用 LaTeX基本上不需要使用者 ...
- Ubuntu 14.04快速搭建SVN服务器及日常使用
1.介绍 Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可以很方面恢复到以前的版本,并可以查看数据更改 ...
- (转载)跟我一起学习VIM - The Life Changing Editor
原文: http://ju.outofmemory.cn/entry/79671 前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程.虽然准备有限,但分享过程中大家大多带着一种 ...
- CTF之PHP黑魔法总结
继上一篇php各版本的姿势(不同版本的利用特性),文章总结了php版本差异,现在在来一篇本地日记总结的php黑魔法,是以前做CTF时遇到并记录的,很适合在做CTF代码审计的时候翻翻看看. 一.要求变量 ...