C语言(四)变量的作用域

一、变量的作用域

C语言根据变量的作用域不同,将变量分为局部变量和全局变量。

1.局部变量

1)定义:在函数内部定义的函数,称为局部变量。形参也属于局部变量。

2)作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。

2.全局变量

1)定义:在所有函数外部定义的变量,称为全局变量。

2)作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以再其定义位置之后共享。

二、变量的存储类型

变量存储类型就是指变量存储在什么地方。

有三个地方可以存储变量:普通内存、运行时堆栈、硬件寄存器。

变量的存储类型决定了变量何时创建、何时销毁,也就是变量的声明周期。

C语言根据变量的存储类型分为:自动变量、静态变量、寄存器变量。

1.自动变量

void test(int a,int b){
	int c =a+b;
	auto int d;
}

1)定义:自动变量是存储在堆栈中的。

2)哪些是自动变量:auto关键字修饰的局部变量,但是基本上是废的,因为所有的局部变量在默认情况下都是自动变量。

3)生命周期:

在程序执行到声明自动变量的代码块(函数)时,自动变量才会被创建,当自动变量所在的代码块(函数)执行完毕后,这些变量就会自动销毁。如果这一个函数重复调用,这些自动变量每次都会重新创建。

2.静态变量

#include <stdio.h>
#include "one.h"
#include "two.h"
int a ;//静态变量
void test2(){
	static int b=0;//静态变量
	b++	;
}
int main(){
	test2();
	printf("%d\n",b);
	return 0;
}

1)定义:静态变量是存储在静态内存中的,也就是不属于堆栈。

2)哪些是静态变量

所有的全局变量都是静态变量

被static 关键字修饰的局部变量也是

3)生命周期

静态变量是在程序运行之前被创建的,在程序的整个运行期间始终存在,直到程序结束。

4)生命周期和作用域的理解

上面个的变量a,在代码执行到该行时,创建一个静态变量,存储在静态内存中。

作用域:在该行代码之后。生命周期:整个程序运行期间。

变量b是在函数内部定义的,在第一次调用函数的时候被创建,存储在静态内存中,第二次调用函数时,该行不被执行。作用域:函数内部。生命周期:整个程序运行期间。

3.寄存器变量

1)定义:存储在一个硬件寄存器中的变量,称为“寄存器变量”。寄存器变比存储在内存中的变量访问效率更高。默认情况下:自动变量和静态变量都是存储在内存中的,只是静态变量是存储在静态内存中的。

2)哪些变量是寄存器变量

register关键字修饰的自动变量。

只有自动变量才可能是寄存器变量。

寄存器变量只限于int、char、指针。

3)生命周期

因为寄存器变量本身就是自动变量,所以函数中的寄存器变量-在调用函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。

4)使用注意

由于计算机中寄存器数目有限,不能使用太多的寄存器标量。如果寄存器使用饱和时,程序将寄存器变量将自动转化为自动变量处理。

总结:

按作用域分:全局变量和局部变量

全局变量:在函数外声明的变量

局部变量:函数内部和函数形参

按存储位置分:自动变量、静态变量、寄存器变量

自动变量:所有的局部变量

静态变量:全局变量和static修饰的局部变量

寄存器变量:register修饰的局部变量。

时间: 2024-10-12 09:27:30

C语言(四)变量的作用域的相关文章

C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内存分布:全局数据区 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 全局静态变量 作用域:文件作用域(只在被定义的文件中可见.) 生命周期:程序运行期一直存在 内存分布:全局数据区 定义方法:static关键字,const 关键字 注意:只要文件不互相包含,在两个不同的文件中

11-黑马程序员------C 语言学习笔记---C语言的变量的作用域和储存类型

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 五 变量的作用域和储存类型 01 变量的作用域是指该变量有效地区域,C语言中得变量分为局部变量和全局变量. 02 局部变量: *局部变量的作用域仅限于定义它的代码块内,离开代码块内便失去作用. *形参只有在函数内有效,其也属于局

李洪强漫谈iOS开发[C语言-016]-变量的作用域

C语言中变量、全局变量与变量的作用域

什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是一种标识符,用来标识变量和常量的.变量和常量必须用标识符(或者可以理解成一个名字)来表示后才能使用. 赋值表达式语句把值赋给变量,或者更一般地说,把值赋给存储空间. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

C语言入门(十四)变量的作用域和存储类型

变量的作用域和存储类型 一.作用域和生存期 C程序的标识符作用域有三种:局部.全局.文件.标识符的作用域决定了程序中的哪些语句可以使用它,换句话说,就是标识符在程序其他部分的可见性.通常,标识符的作用域都是通过它在程序中的位置隐式说明的. 1.局部作用域 前面各个例子中的变量都是局部作用域,他们都是声明在函数内部,无法被其他函数的代码所访问.函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部所用的语句块. void add(int); main() { int num=5; add(

第四章—变量,作用域和内存问题(二)

第四章-变量,作用域和内存问题(二) JS没有块级作用域 js没有块级作用域,这个概念容易导致误解,这里就区分下几个情况,大家好好参考下: 我们知道,在其他类C的语言中,由花挂号封闭的代码块都有自己的作用域.但是在JS中,却没有块级作用域: 这里if(true){}代表条件永真,永远执行这条.if(false){}的话就是永远不执行这条. 这个代码执行之后,在if语句定义的变量,在if语句外可以访问的到.在if语句中的变量声明会将变量添加到当前的执行环境中(这里是全局环境). 还有如下的两个例子

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情况下,变量在声明的时候可以使用等号“=”进行初始化. 用户定义类型可以使用struct,在结构体中所有变量类型都必须是OpenGL ES着色器语言定义的关键字.OpenGL ES着色语言是类型安全的,因此不支持隐式类型转换.

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,uniform,纹理查找,等等),是不是顶点或者片元着色器,还有其他一些底层实现的细节.最低存储需要通过精度修饰符来声明.典型地,精度操作必须要保留变量包含的精度存储.仅有的例外是需要大量复杂计算的内建函数,如atan(),返回值的精度低于声明的精度. 强烈建议顶点语言提供一种匹配IEEE单精度浮点数或更高精

js和PHP等脚本语言for循环和if语句里面定义变量的作用域

在js和PHP等脚本语言中for循环中的定义变量,会先把var l 提到for循环外面,(只会定义一次l),所以for循环外面可以输出l var a=0; if(a==0) { var i=1; } alert(i); for(var j=0;j 在c#等语言中 for(int i=0;ijs和PHP等脚本语言for循环和if语句里面定义变量的作用域