C语言关键字 extern const static - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

C语言关键字 extern const static

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:409

引言

C语言共有32个关键字,其中extern const 和 static都是有关存储与生命周期的类型。【1】

复习

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack):

由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap):

一般由程序员分配释放,如c中malloc函数,C++中new运算符,若程序员不释放,程序结束时可能由系统回收 。

3、全局区(静态区)(static):

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

4、文字常量区:

常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区:

存放函数体的二进制代码。

static关键字

static在c里面可以用来修饰变量,也可以用来修饰函数。
先看用来修饰变量的时候。在c里面变量可分为全局数据区、栈和堆里

一:static变量的常见应用

1:静态局部变量和普通局部变量的区别:

它们的主要区别是作用域不同,静态局部变量的是包含它当前的源文件,该工程的其他源文件是不可以访问它的。这样做的好处是多人联合开发时,不必担心变量名冲突问题。而普通局部变量的的作用域是当前的整个工程,整个工程里的不同文件可以共享全局变量。

两者都存放在全局数据区,如果没有初始化,系统将其自动初始化为0。

2:静态局部变量和普通局部变量的区别:

(1):存储位置不同:

静态局部变量被static修饰,其生命周期是全局的,在整个源文件执行完毕后释放,而不会在某个当前函数执行完就释放,所以说静态局部变量存储在全局数据区。由于整个生命周期是全局的,所以对其初始化只会执行一次,后面遇到的合法初始化也会自动跳过。但是其作用域还是局部的,在其作用域外不可以被调用。

普通局部变量存放在堆栈中,随函数执行完毕后自动释放。

(2):默认初始值不同,静态局部变量默认初始值为0,但其如果人为初始化只执行一次,后面的初始化都不会再执行。而普通局部变量初始值随机,但是每一次合法初始化都会执行。
典型应用:

#include <stdio.h>

static int a;//静态变量,只初始化一次,默认为0
static void fun();//静态函数,只初始化一次

int main()
{
    fun();
    printf("main:a=%d\n",a);
    fun();

    return 0;
}

static void fun()
{
    static int a=10;
    int b=20;
    a*=10;
    b*=20;
    printf("fun:a=%d,b=%d\n",a,b);
}

运行结果:
在这里插入图片描述

静态函数只初始化一次,而普通函数可以多次初始化。且普通全局变量默认为0。

const关键字

如果一个变量被const修饰,那么它的值就不能再被改变。注意:用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值。
1.修饰普通变量
加const修饰是为了防止变量被修改
如果该变量为全局变量,则不能通过指针修改,但如果是局部变量,则还是可以通过指针修改的。

原因是:全局变量在全局静态区,内容不能被修改,但局部变量本身仍在栈区,可以使用指针修改。
2.修饰指针变量
1)当const修饰*号时,表示不能通过指针p_a修改p_a指向的内容。这句话有3层意思(对应上述代码三种情况):

①当p_a指向a时,不能通过指针p_a取*号修改a中的内容

②a中的内容仍可以由a自身修改

③p_a指向可以改变,即p_a可以指向b

可以这么记忆:号是指针用来对指向的内存操作(读写)的,当对加了const修饰,意味着号的操作只剩下只读的功能,也就是只能使用号来读取指针指向的内容,而失去了写的特性,这点与普通变量的情况类似。
2)当const修饰变量p_a时,表示不能改变p_a的内容,即改不了指针的指向。这句话有3层意思(对应上述代码三种情况):

①当p_a指向a时,能通过指针p_a取*号修改a中的内容

②a中的内容仍可以由a自身修改

③p_a指向不可以改变,即p_a不可以修改,指向b或者其他变量
3.修饰函数

to be continued

C++中对static和const的扩展和

相关案例查看更多