技术干货集中营
直播中

7年用户 48经验值
擅长:266327
私信 关注

跟着狄泰唐老师学C语言进阶教程的笔记之变量的属性

1.C语言中变量的属性
C语言中的变量可以有自己的属性
在定义变量的时候可以加上“属性”关键字
“属性”关键字指明变量的特有意义
A.语法:
property type var_name;
B.示例:
int main()
{
        auto int i = 0;
        static int k = 0;
        register int j = 0;
        extern double m;
}
2.auto关键字
auto 即C语言中局部变量的默认属性
auto表明被修饰的变量存储在栈上
编译器默认所有的局部变量都是auto的
3.register关键字
register 关键字指明将局部变量存储于寄存器中
register只是请求寄存器变量,但不一定请求成功
register变量的必须是CPU寄存器可以接受的值
不能用&运算符获取register变量的地址
示例:
//全局变量的生命周期是从程序运行到关闭结束,所以register不能生命static 和全局的变量
//static register  int g_v;
int main()
{
        int i_var = 0;//局部变量,在栈上分配内存
        static int svar = 0;//静态局部变量,在静态数据区分配内存,作用域main函数内
        register char var = 0;
        //不能用&获取register修饰的变量,该变量存储在CPU寄存器中,不能获取地址
        printf("%#x",&var);//错误
        return 0;
}
register关键字是由于C语言早期是从B语言发展过来,为了效率兼顾,所以。。。
4.static 关键字
static 关键字指明变量的“静态”属性
A.static 修饰的局部变量存储在程序的静态区
static 关键字同时具有“作用域限定符”的意义
A.static修饰的全局变量作用域只是声明的文件中
B.static修饰的函数作用域只是声明的文件中
示例:
int g_v;//全局变量 程序的任意地方均能访问,在静态数据区分配内存
static int g_vs;//静态全局变量,只有当前文件中可以访问,静态数据区分配内存
int main()
{
        int i_var = 0;//局部变量,在栈上分配内存
        static int svar = 0;//静态局部变量,在静态数据区分配内存,作用域main函数内
return 0;
}
5.auto,register,static关键字示例程序
int  f1()
{
        int r = 0;
        r++;
        return r;
}
int  f2()
{
//程序运行中,只初始化一次,一直存储在全局静态区
        static int r = 0;
        r++;
        return r;
}
int main()
{
        auto int i = 0;
        static int k = 0;
        register int j = 0;
        printf("%pn", &i);
        printf("%pn", &k);
        for (i = 0; i < 5; i++)
        {
                printf("%dn", f1());
        }

        for (i = 0; i < 5; i++)
        {
//f2中声明的静态的局部变量,会进行累加
                printf("%dn", f2());
        }
        return 0;
}
6.extern 关键字
extern 用于声明“外部”定义的变量和函数
A.extern 变量子在文件的其它地方分配内存控件
B.extern 函数在文件的其它地方定义
C.示例
                        test.c文件中代码:
int g_i=5;
static int g_is = 5;
int getI()
{
        return g_is;
}
main.c文件中的代码:
//声明访问外部定义的g_i变量
extern int g_i;
//声明访问外部定义的g_is变量
extern int g_is;
//声明访问外部定定义的getI函数
extern int getI();
int main()
{
        printf("f(1,2)=%dn", f(1,2));
        printf("%dn", g_i);
//不能找到外部定义的g_is变量,因为外部声明了static
        //printf("%dn", g_is);         
printf("%dn", getI());
        getchar();
        return 0;
}
小结论:从某种意义上来说,static 和 extern 是互斥的
extern 用于“告诉”编译器用C方式编译
注意:C++编译器和一些变种的C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器以“标准C”方式进行编译。
A.示例1:.C文件中 ,将函数f 以“标准C”方式进行编译
//定义函数以C表示运行
#ifdef __cplusplus
extern "C" {
#endif
        int f(int a, int b)
        {
                return a + b;
        }
#ifdef  __cplusplus
}
#endif
B.示例2:.CPP文件中声明以“标准C”方式进行编译
//C++中定义函数以C表示运行
extern "C"
{
        int f(int a, int b)
        {
                return a + b;
        }
}
7.小结
auto 变量存储在程序的栈中,默认属性
static 变量存储在程序静态区
register 变量请求存储于CPU寄存器中
extern 表示变量或函数在其它文件中分配空间和声明
extern 能够指示编译器按照标准C方式编译程序

回帖(3)

李明

2017-6-10 07:13:55
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶1111
举报

雨中的纸风车

2017-7-4 13:18:28
举报

fumiping

2017-7-14 12:31:58
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分