static const volatile

其他文件即使用 extern 声明也没法
使用他。我是一个努力学习的小白,加油!

static

1.只初始化一次(值可以改变)
2.修饰的变量如果未初始化,初始化值为0
3.存放在静态区
4.限制作用域:修饰局部变量时,只能作用在局部(例如在某个函数内)
修饰全局变量时,限制在本文件内,其他文件即使用 extern 声明也没法使用他。

**由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结
束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。**

#include <stdio.h>
static int j;
void fun1(void)
{
    static int i = 0;
    i ++;
    printf("i=%d\n",i);
}
void fun2(void)
{
    j = 0;
    j++;
    printf("j=%d\n",j);
}
int main()
{
    int k;
    for(k=0; k<10; k++)
    {
        fun1();
        fun2();
    }
    return 0;
}
//i和j打印的结果(答案在最后,建议自己想想,然后运行一下啊代码)

const

1.修饰基本简单类型(非指针)变量的值不允许改变:

const int i;
int const i;

2.修饰指针

const char *p//指针指向的内容不可以改变。但指针的指向可以改变
char *const p//指针的指向不可以改变,但指针指向的内容可以改变
const char *const p//指针的指向和指向的内容都不可以改变

volatile

防止编译器优化,在学习汇编时,指令取值不一定每次都是在内存中取值,加上volatile可以让指令每次都在内存中重新取值

下面摘自百度文库
简单地说就是防止编译器对代码进行优化。比如如下程序:

XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;

对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。

答案
i:从1到10
j:一直是1;

发布了33 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shunli008/article/details/78695667