C语言变量声明类型与存储区域探究

来源:互联网 发布:浙江工业大学网络 编辑:程序博客网 时间:2024/05/22 15:17

静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

 

静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

 

全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

一个由C/C++编译的程序占用的内存分为以下几个部分 

栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。

全局区(静态区)(static)全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放 

文字常量区常量字符串就是放在这里的。 程序结束后由系统释放

程序代码区—存放函数体的二进制代码。

 

For循环中其实不管是i++++i都是在for循环体全部执行完毕后才执行,

如:for(int i = 0;i < 10; i++){

printf(“%d\n”,i);

}

等同于for(int i = 0;i < 10; ){

printf(“%d\n”,i);

 i++;

}

for(int i = 0;i < 10; ++i){

printf(“%d\n”,i);

}

同样和for(int i = 0;i < 10; ){

printf(“%d\n”,i);

++i;

}是一个意思

 

i++ :先在i所在的表达式中使用i的当前值,后让i1

++i :让i先加1,然后在i所在的表达式中使用i的新值

 

i++由于是在使用当前值之后再+1,所以会需要一个临时变量来转储,而++则直接+1,不存在这样的问题。

在没有编译器优化的情况下,++i更好。优化过后两者都一样

0 0
原创粉丝点击