C语言中静态存储类型问题 c语言中存储类型的问题

作者&投稿:原侄 (若有异议请与网页底部的电邮联系)
楼主你好!
代码分析如下!
#include <stdio.h>
int func(int x)
{int y=0;
static int z=3; //此处是静态变量,静态变量直到整个程序运行完才释放,局部变量则是执行完该段函数后就释放,这里的y,就是跟例子,所以每次运行fun函数y都是0,然后y++后为1,而z则不同,由于for循环执行了两次,第一次z++后为4,第二次z++后为5
x=z++,y++; //这里虽然是逗号表达,但是=的运算优先级是大于逗号的,所以,x实际上第一次循环是被赋予3,第二次是赋予了4,估计很多人会误认为x是取到y的值,实际上错误的!
return(x);
}
int main()
{int a=2,i,b;
for(i=0;i<2;i++) //循环两次
b=func(a++); //调用fun函数
printf("%d\n",b); //输出b的值
}

最终结果是输出4!
希望我的回答对你有帮助!有什么不清楚的,请继续追问!

详解:

include <stdio.h> //输入,输出函数的包含头文件
int func(int x) //一个整型函数,参数也为整型
{int y=0; //在该函数里面定义了一个整型变量y,并赋初值为0,
//当该函数每调用一次就重新定义一次,重新赋值一次,
//系统为y提供的是一个动态存储空间,当函数执行完,y变量的内存空间被释放
static int z=3; //定义了一个静态整型变量,并赋初值为3。当函数执行完后,它的值不变,
//若再次调 用该函数,它的值从4开始自加1
x=z++, y++; //z和y都自加1,但注意,这是一个逗号表达式,
//第一部分是“x=z++”,第二部分是“y++” 。
//优先级:“分号”最低,过了就是“逗号”, “赋值”要高于“逗号”。。。
//不好意思,刚才弄的太快了。。。嘿嘿
return(x); //将x作为返回值,返回给主调函数
}
void main() //程序的开始函数和结束函数
{int a=2,i,b; //定义了三个变量,并赋初始值a为2
for(i=0;i<2;i++) //进入for循环,执行i=0和i=1这两种情况下的循环体
b=func(a++); //调用func函数,以a的值作为实参传给func函数的形参,并且a要自加1,执行完后,函数的返回值赋值给变量b
printf("%d\n",b); //打印出b的值
}

有两个知识点需要知道:
1、静态变量与普通变量无二,区别在于静态变量始终占有内存,进出函数不会被改变,不消失。只在同一文件中能调用,其他文件无法调用。
在你的程序中,b的值取决于函数func中的z值,第一次循环进去函数func返回3,静态变量自加变为4,第二次循环返回4.

static变量z只初始化一次,所以for循环两次,第一次b等于z等于3,同时z++变为4,第二次循环时b等于4,同时z++变成5。由于,显示的是最后一次的b,所以最终结果为4

C语言的数据区分为静态存储区与动态存储区。
静态存储是指在程序运行期间给变量分配固定存储空间的方式。如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。
动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。

C语言动态和静态存储类别的区别~

SRAM的特点是工作速度快,只要电源不撤除,写入SRAM的信息就不会消失,不需要刷新电路,同时在读出时不破坏原来存放的信息,一经写入可多次读出,但集成度较低,功耗较大。SRAM一般用来作为计算机中的高速缓冲存储器(Cache)。 DRAM是动态随机存储器(Dynamic Random Access Memory),它是利用场效应管的栅极对其衬底间的分布电容来保存信息,以存储电荷的多少,即电容端电压的高低来表示“1”和“0”。DRAM每个存储单元所需的场效应管较少,常见的有4管,3管和单管型DRAM。因此它的集成度较高,功耗也较低,但缺点是保存在DRAM中的信息__场效应管栅极分布电容里的信息随着电容器的漏电而会逐渐消失,一般信息保存时间为2ms左右。为了保存DRAM中的信息,必须每隔1~2ms对其刷新一次。因此,采用 DRAM的计算机必须配置动态刷新电路,防止信息丢失。DRAM一般用作计算机中的主存储器。

刚入门吧,这就像你的家一样,如果你可以不得到别人的允许就进入别人家,别人也进你家,你乐意吗?这涉及到内存私有化,为了保护数据改写完全符合标准,从而避免产生更为严重的BUG,例如你从流中获取一个int类型的数据,准备将数据写入变量age中,但是变量age属于另一个类,这时如果流中获取到的是一个字符,比如'a',你直接改写类中的属性,就会造成不可避免的错误。此外,这种私有化操作是为了更好的利用内存空间。
比如下列代码:
#include using namespace std;int a;int main(){ { int b; } return 0;}变量a会占据相应内存空间,变量b也会占据。但是在{int b}这里的分号结束后,b的内存空间被回收,而a尽管没有使用,任然占用内存空间。如果一个程序都是靠全局变量维持,那么我估计你家的photoshop跑起来需要3根2G内存条。

static在c语言中是什么意思
答:2、修饰函数 函数前加static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。关键字static 有着不寻常的历史。起初,...

在c语言中,未指定的局部变量,其隐含的存储类别为静态存储,为什么不对...
答:隐含的存储类别为动态存储,即auto型的,如果要静态,需要在变量前加上static关键字

C语言中全局变量的储存类别是
答:C语言中全局变量的储存类别是静态存储区。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。

基本变量C语言
答:在C语言中,变量的存储方式是其关键特性,它决定了变量在内存中的存储方式和生命周期。主要有两种存储类型:静态存储和动态存储。首先,动态存储,也称为自动存储,其变量类型有auto和register。auto变量通常被寄存在寄存器中,如果寄存器不足,才会存储在栈中。它们在函数或复合语句内部定义,其生存期仅限于...

C语言中有哪些存储类型?
答:3. register存储类型 声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期。4. static存储类型 被声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为...

C语言, 存储类型关键字是什么?
答:3 register:声明寄存器变量。声明后,变量存储于CPU寄存器中。是最快的C语言变量。但是需要注意的是,CPU寄存器有限的,所以并不是所有声明为register的变量都会存在寄存器中。使用register更像是一个申请,具体是否可以存在寄存器还要看系统情况。 该项尽量少用。4 static :声明静态变量。有静态局部变量和...

在C语言中,只有在使用时才占用内存单元的变量,其存储类型是( )。
答:【答案】:A 本题的考查点是变量的存储类型。extern、register、static、auto分别是定义自动变量、寄存器变量、静态变量、外部变量,其中,自动变量和寄存器变量属于动态存储,调用时临时分配单元;而静态变量和外部变量属于静态存储,在整个程序运行时间都存在。

C语言中,数据的存储类型有哪五种?
答:5种基本数据类型的存储空间长度的排列顺序为 :A)char<int<long int<=float<double。char:char类型是一个单一的1 字节,数值范围-128 到 127 或 0 到 255,char 数据类型可以储存任何字符,对应的包装类:Character。int:2 或 4 字节、有符号的以二进制补码表示的整数,,min : -2,147,48...

java里的静态类占的内存大吗
答:错误的理解,应该具体问题具体分析。静态的类确实会在内存中开辟一块静态区域来存储数据,并且会一直占据内存。但是他只占用一块内存,但是动态的也许会对一个类创建多个对象,这样的话就会比静态的类占据的内存多了。静态的类应为在内存里只有一块内存,所以你要是想同时使用一个类的几个不同的实例应该...

c语言常量变量在内存中的存储方式
答:从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。在栈上创建(地址从大到小):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,...