05_变量属性

Posted chen-ace

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05_变量属性相关的知识,希望对你有一定的参考价值。

变量属性

C语言定义变量属性的关键字主要有auto、register、static、extern

1、auto关键字

技术分享图片

2、register关键字

(1)register关键字指明将局部变量存储于寄存器中;
(2)register只是请求寄存器变量,并不一定能成功;
(3)register变量必须是CPU寄存器可以接受的值;
(4)不能用&运算符获取resister变量的地址;
(5)register不能作为全局变量,因为寄存器不能被一个变量一直占用;
技术分享图片

3、static关键字

技术分享图片
技术分享图片

4、extern关键字

技术分享图片

5、编写代码

(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
", &i);
    printf("%p
", &l);
    printf("%p
", &k);
    //printf("%p
", &j); // error

    for(i=0; i<5; i++)
    {
        printf("%d
", f1());
    }

    for(i=0; i<5; i++)
    {
        printf("%d
", f2());
    }

    return 0;
}

输出结果为:
技术分享图片
(2)static和extern的使用

#include <stdio.h>

extern int g_i;

int main(void)
{
    printf("%d
",g_i);
    return 0;
}

int g_i;

输出结果为:0
若把int g_i屏蔽,则

#include <stdio.h>

extern int g_i;

int main(void)
{
    printf("%d
",g_i);
    return 0;
}

//int g_i;

输出结果为:
技术分享图片
同样的道理,当其他文件里的变量被static修饰了,extern关键字失去作用;
1.c

#include <stdio.h>

extern int g_i;

int main(void)
{
    printf("%d
",g_i);
    return 0;
}

2.c

static int g_i;

输出结果同样会报错

若代码改为一下情况,则不会报错;
1.c

#include <stdio.h>

extern int getI();

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

    return 0;
}

2.c

static int g_i;

int getI()
{
    return g_i;
}

输出结果为:0

6、小结

技术分享图片

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">






















以上是关于05_变量属性的主要内容,如果未能解决你的问题,请参考以下文章

我正在片段中启动我的活动,但变量变为空?

初始化问题之前使用的另一个变量“__”

在创建VSCode片段时,如何将变量转换为title-case(如TitleCase)?

片段如何设置属性“windowSoftInputMode”

什么时候需要属性而不是仅仅在 Python 中公开变量?

如何在 python 中并行化以下代码片段?