打印
[C语言]

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

[复制链接]
809|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Damon_1|  楼主 | 2017-5-27 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
老师课程观看地址在21ic上有,发不出链接来。大家一起学习
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("%p\n", &i);
        printf("%p\n", &k);
        for (i = 0; i < 5; i++)
        {
                printf("%d\n", f1());
        }

        for (i = 0; i < 5; i++)
        {
//f2中声明的静态的局部变量,会进行累加
                printf("%d\n", 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)=%d\n", f(1,2));
        printf("%d\n", g_i);
//不能找到外部定义的g_is变量,因为外部声明了static
        //printf("%d\n", g_is);        
printf("%d\n", 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方式编译程序

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

10

帖子

1

粉丝