c语言重温笔记(1)

 

大一匆匆结束了。 作为一名软件工程的学生,大一就接触学习了c/c++。 总体来说,学的还是不够细,不够透。

暑假,借此机会,重新啃啃这两门语言,写写博客,方便以后自己温习,也希望,能和大家一起交流分享。

下面的内容, 主要来自《大学生程序设计课程与ACM竞赛实训教材》,一些大牛的博客,还有就是得学习心得。

话不多说,上代码。

 

 

1.变量的存储类别

变量除了类型属性(int ,char ,float....)外,另外一个重要属性就是存储类别

系统把程序中用到的数据区分为静态存储区和动态存储区。

静态存储区:在这个区分配了空间的变量,在程序运行过程中一直存在,即相对是不变的。

动态存储区:在这个区分配了空间的变量,可能随时被释放,即相对是不断变化的。

 

c语言提供了存储类别说明符包括: auto(自动的),static(静态的),register(寄存的),extern(外部的)

语法格式:   [存储类别说明符] 类型说明符 变量;             如:  static int a;

 

在定义变量时,存储类别说明符可以省略,缺省情况下是auto,系统会根据变量是局部变量还是全局变量自行分配。

其中,全局-------静态存储区                  局部---------------动态存储区。

ps:解释下全局变量和局部变量

全局变量:  全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。

int main()
{
    int i = 2, j = 3, k;
    k = i + j;
    {
        int k = 8;
        printf("%d\n",k);
    }
    printf("%d\n",k);
    return 0;
}

 

运行结果:   8

                     5

本程序在main中定义了i,j,k三个变量,其中k未赋初值。而在复合语句内又定义了一个变量k,并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用,而在复合语句内则由在复合语句内定义的k起作用。因此程序第4行的k为main所定义,其值应为5。第7行输出k值,该行在复合语句内,由复合语句内定义的k起作用,其初值为8,故输出值为8,第9行输出i,k值。i是在整个程序中有效的,第7行对i赋值为3,故以输出也为3。而第9行已在复合语句之外,输出的k应为main所定义的k,此k值由第4 行已获得为5,故输出也为5。

注:如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被屏蔽,即它不起作用。

 

当然,我们也可以改变变量的存储区,即人为的设定。 

注意,全局变量一定是在静态存储区分配空间,这点不能改变。(全局变量在程序运行过程中自始至终都存在)

至于局部变量,它可以在动态区,也可以在静态区。

下面举例说明局部静态变量。

#include 
#include 
int func( void )
{
    static c = 0;
    c = c + 1;
    return c;
}
int main()
{
    int i, a;
    for ( i=0; i<5; i++ )
    {
        a = func();
        printf("%d  ",a);
    }
}
输出为:  1  2  3  4  5

在函数func第一次被调用的时候,系统为静态局部变量c在静态区分配空间,并赋初值0,函数执行后c变为1,当函数返回时,变量c的空间并不释放,依旧保持在静态区,并且保留现有数据值1,当函数再次被调用时,不再为c重新分配空间,还是利用原有c,所以执行+1操作后,c变成2.,如此进行。

 

现在谈谈静态全局变量。  之前提过,全局变量一定是在静态存储区分配空间,而这里的static,不是说明全局变量在哪个存储区分配空间,而是用来限制变量作用域的。

这就关联到了我们要谈的extern,当在编写较大程序时,往往将代码分成不同的几个源文件分别存储,这样就得利用到extern来访问其他源文件中的变量。

如果在一个源文件中定义的全局变量不允许其他文件中的代码使用,则将变量定义成静态全局变量,即使在其他文件中使用了extern声明也无法使用。

例如:

int a;
static int b; //静态全局变量
main()
{
   ....
}
extern int a;  // 说明后可以引用
extern int b;  //说明后也无法引用
func()
{
   ...
}


最后说明下register,register定义的变量,是将变量存储在CPU的内部寄存器中,从而避免每次的内存访问,以达到提高效率的目的。所以,一般是在代码量小的,经常使用的进行特殊声明。   不过实际上,寄存器是十分有限的,并且受到数据类型的限制,还有并不是所有的编译器都能实现这一功能,所以具体使用比较少。

 

今天就先写这些,主要介绍了4种变量的存储类别,   希望,能给大家带来一些帮助。

水平有限,如有错误,欢迎指正。

你可能感兴趣的:(c/c++)