标签:row 地址 stat 关键字 文件 技术分享 ble border 情况
C语言定义变量属性的关键字主要有auto、register、static、extern
(1)register关键字指明将局部变量存储于寄存器中;
(2)register只是请求寄存器变量,并不一定能成功;
(3)register变量必须是CPU寄存器可以接受的值;
(4)不能用&运算符获取resister变量的地址;
(5)register不能作为全局变量,因为寄存器不能被一个变量一直占用;
(1)auto、register、static对比分析
#include <stdio.h>
int f1()
{
int r = 0;
r++;
return r;
}
int f2()
{
static int r = 0;
r++;
return r;
}
int main()
{
auto int i = 0; // 显示声明 auto 属性,i 为栈变量
auto int l = 1; // 显示声明 auto 属性,l 为栈变量
static int k = 0; // 局部变量 k 的存储区位于静态区,作用域位于 main 中
register int j = 0; // 向编译器申请将 j 存储于寄存器中
printf("%p\n", &i);
printf("%p\n", &l);
printf("%p\n", &k);
//printf("%p\n", &j); // error
for(i=0; i<5; i++)
{
printf("%d\n", f1());
}
for(i=0; i<5; i++)
{
printf("%d\n", f2());
}
return 0;
}
输出结果为:
(2)static和extern的使用
#include <stdio.h>
extern int g_i;
int main(void)
{
printf("%d\n",g_i);
return 0;
}
int g_i;
输出结果为:0
若把int g_i屏蔽,则
#include <stdio.h>
extern int g_i;
int main(void)
{
printf("%d\n",g_i);
return 0;
}
//int g_i;
输出结果为:
同样的道理,当其他文件里的变量被static修饰了,extern关键字失去作用;
1.c
#include <stdio.h>
extern int g_i;
int main(void)
{
printf("%d\n",g_i);
return 0;
}
2.c
static int g_i;
输出结果同样会报错
若代码改为一下情况,则不会报错;
1.c
#include <stdio.h>
extern int getI();
int main()
{
printf("%d\n", getI());
return 0;
}
2.c
static int g_i;
int getI()
{
return g_i;
}
输出结果为:0
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
标签:row 地址 stat 关键字 文件 技术分享 ble border 情况
原文地址:https://www.cnblogs.com/chen-ace/p/9838197.html