总结

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函数变量的更多相关文章

  1. (C/C++学习笔记) 九. 变量的存储类型

    九. 变量的存储类型 ● 变量的存储类型(见附页) ● 注释 ①对于自动变量,它属于动态存储方式. 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个 ...

  2. C语言中变量的存储类型

    在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register   寄存器变量extern 外部变量static   静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...

  3. C06 变量和存储类型

    目录 全局变量 局部变量 存储类型 全局变量和局部变量 变量的作用域 作用域:某些事物起作用或有效的区域. 变量的使用范围称为变量的作用域. 变量的作用域决定了变量的可操作性和有效性. C语言变量的作 ...

  4. C++变量的存储类型

    C++变量和函数包括两个属性:数据类型和数据的存储类型.存储类型是指数据在内存中存储的方式.变量的存储类型分为四种:自动类型(auto),寄存器类型(register).静态类型(static)外部类 ...

  5. 01-Java基础知识:数据类型与变量、标识符、运算符、表达式

    Java基础知识:数据类型与变量.标识符.运算符.表达式 一.数据类型 Java定义了基本数据类型.引用数据类型.自定义类型. 八种基本数据类型:byte (1). short (2).  int ( ...

  6. C和指针 第三章 变量的储存类型 auto、static、register以及static关键词

    变量的储存类型决定标量何时创建,何时销毁以及他的值保持多久.有三个地方可以储存变量: 普通内存static 运行时堆栈auto 硬件寄存器register 变量的缺省储存类型取决于它的声明位置: 静态 ...

  7. 存储类型auto,static,extern,register的区别 <转>

    变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种. 内存中.具体点来说内存分为三块:静态区,堆 ...

  8. C++基础知识篇:C++ 变量类型

    变量其实只不过是程序可操作的存储区的名称.C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和下划线字 ...

  9. js基础知识之_入门变量和运算符

    js页面效果学习 (轮播图,文字滚动效果等等) javascript能来做什么 1.数据验证 2.将动态的内容写入网页中(ajax) 3.可以对时间做出响应 4.可以读写html中的内容 5.可以检测 ...

随机推荐

  1. centos 7 五笔安装

    # yum install ibus ibus-table-wubi 需要重启动

  2. 菜鸟学Java(十八)——异常

    每个学编程的人在编程的过程中都会遇到各种异常.那么当我们遇到异常的时候该怎么处理呢?针对不同的异常我们又该采取什么具体的处理方式呢?这些问题在我开始学编程的很长一段时间里我都不太清楚,还好随着不断的学 ...

  3. Linux下找不到so文件的解决办法

    http://www.cnblogs.com/xudong-bupt/p/3698294.html 如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时 ...

  4. python-zip方法

    zip 返回一个将多个可迭代对象组合成一个元组序列的迭代器. 1.  循环多个list的数据: letters = ['a', 'b', 'c'] nums = [1, 2, 3] for lette ...

  5. 【Acm】算法之美—Jugs

    题目概述:Jugs In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted wi ...

  6. 【驱动】网卡驱动·linux内核网络分层结构

    Preface   Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计. Linux内核采用分层结构处理网络数据包.分层结构与网络协议的结构匹配,既能简化数据包处理流程 ...

  7. 【Socket】linux黑客之网络嗅探底层原理

      1.mystery引入 1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的 2)原始套接字是一种套接字底层技术,它工作在网络层 3)谈到网络安全,刚好本学期学过这门课程,这里myst ...

  8. Android.mk简介

    http://www.cnblogs.com/hnrainll/archive/2012/12/18/2822711.html Android.mk文件是GNU Makefile的一小部分,它用来对A ...

  9. Git pull error: Your local changes to the following files would be overwritten by merge:

    联合开发,遇上的一个问题,果然,在此验证了百度的不靠谱,是谷歌出的答案...... stackoverflow上有解决方案,链接:http://stackoverflow.com/questions/ ...

  10. 青铜到王者,快速提升你 MySQL 数据库的段位!

    Reference: https://mp.weixin.qq.com/s?src=11&timestamp=1513259125&ver=574&signature=Uxls ...