第5课 变量属性

1.C语言的变量属性

(1)C语言中的变量可以有自己的属性

(2)在定义变量的时候可以加上“属性”关键字

(3)“属性”关键字指明变量的特有意义。语法:property type var_name;

如: auto char i;
    register int j;
    static long k;
    extern double m;

2. auto关键字

(1)auto即C语言中局部变量的默认属性

(2)auto表明将被修饰的变量存储于栈上

(3)编译器默认所有的局部变量都是auto的

     示例:

void f(){
   int i;        //局部变量默认属性为auto
   auto int j;//显示声明auto属性
}

3. register关键字

(1)register关键字指明将局部变量存储于寄存器中

(2)register只是请求寄存器变量,但不一定请求成功

(3)register变量必须是CPU寄存器可以接受的值

(4)不能用&运算符获取register变量的地址

#include<stdio.h>

register int g_v;   //error,只能是局部变量,因为全局变量的生存期长,占用寄
                    //存器,编译器直接报错。

int main()
{
    register char var;
    printf("0x%08X
", &var);//error,寄存器变量没有内存地址!因为存放在寄存器上。
}

4. static关键字

(1)static关键字指明变量的“静态”属性——局部变量存储在程序静态区

(2)static关键字同时具有“作用域限定符”

  ①static修饰的全局变量作用域只是声明的文件中

  ②static修饰的函数作用域只是声明的文件中

【示例】

#include <stdio.h>

int g_v;                //全局变量,程序的任意地方均能访问
static int g_vs;     //静态全局变量,只有当前文件中可访问

int main()
{
   int var;             //局部变量,在栈上分配空间
   static int svar;     //静态局部变量,在静态数据区分配空间
   
   return 0;
}

【编程实验】 auto、register、static对比分析

#include<stdio.h>

int f1()
{
    int r = 0;
    r++;

    return r;
}

intf2()
{
    static int r = 0; //静态局部变量,只被初始化一次
    r++;

    return r;
}

int main()
{
    auto int i = 0;    //显式声明auto属性,i为栈变量
    static int k = 0;  //局部变量k的存储区位于静态区,作用域位于main中
    register int j = 0; //向编译器申请将j存储于寄存器中

    printf("%p
", &i);
    printf("%p
", &k);
    //printf("%p
", &j);  //error,寄存器变量没有内存地址,编译器直接报错。

 
    for (i = 0; i < 5; i++)
    {
        printf("%d
", f1());    //输出5个的1,因为使用的是局部变量。
    }
 
    for (i = 0; i < 5; i++)
    {
        printf("%d
", f2());    //输出1、2、3、4、5,因为使用的是静态局部变量
    }

    return 0;
}

5. extern关键字

(1)extern用于声明“外部”定义的变量和函数

  ①extern变量在文件的其它地方分配空间

  ②extern函数在文件的其它地方定义

(2)extern用于“告诉”编译器用C方式编译

C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通用extern关键字可以命令编译器“以标准C方式进行编译”。

extern “c”

{

    int f(int a,int b)

    {

        return a + b;

     }

}

【编程实验】static和extern的使用

例1:

#include<stdio.h>

extern int g_i;  //若不声明g_i为“外部”的,下面printf会找不到g_i;

int main()
{
    printf("%d
", g_i);  //编译器发现此时g_i未定义,可以是在g_i前
                          //用extern声明为在其他地方定义的。
    return 0;

}

int g_i = 0;

例2:

/**************************g.c文件**************/

static int g_i;  //g_i只能在本文件中使用

int getI()
{
    return g_i;
}

/**************************main.c文件**************/

#include<stdio.h>

extern int getI(); //extern声明getI函数是在其他地方定义的。

int main()
{
    printf("%d
", getI());                       

    return 0;
}

6. 小结

(1)auto变量存储在程序的栈中,为默认的属性

(2)static变量存储在程序静态区中

(3)register变量请求存储于CPU寄存器中

(4)extern变量在文件的其它地方分配空间

(5)extern能够指示编译器按照标准C方式编译程序

原文地址:https://www.cnblogs.com/5iedu/p/5317835.html