10:30:22 2019-08-20

基础不牢 瞬间爆炸

参考资料:https://blog.csdn.net/ts_54eagle/article/details/4418627

https://blog.csdn.net/xingjiarong/article/details/47656339

https://blog.csdn.net/xingjiarong/article/details/47656339

看看C Primer Plus上是怎么定义的

先说说作用域 分为4种:块作用域 函数作用域 函数原型作用域 文件作用域

这里要说明的是 块作用域指{}之间的部分

而函数作用域单单指goto标签   当goto标签出现在函数内部时 goto标签作用域蔓延至整个函数

函数原型作用域从形参定义到原型声明结束为止

文件作用域指的是 该文件 该文件 该文件  从变量定义到文件末尾都可见

链接分为3种:外部链接 内部链接 无链接  (决定了是否能被外部文件使用)

块作用域 函数作用域 函数原型作用域的变量 都属于无链接

文件作用域的变量  可以属于外部链接 也可属于内部链接

内部链接的文件作用域 称为 文件作用域(只能在该文件内部使用)

外部链接的文件作用域 称为 全局作用域(整个程序都可使用)

一个具有文件作用域的变量默认是具有全局作用域的   在前面加上static变为具有文件作用域

C对象有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。

如果某个变量具有静态存储期,该变量在程序运行过程中一直存在   文件作用域具有静态存储期

在具有文件作用域的变量前加上static 表示该变量的作用域限制为内部链接

对于所有的具有文件作用域的变量(无论它具有内部链接还是外部链接)都具有静态存储期  而声明了static的文件作用域的变量具有内部链接

存储类别 存储期 作用域 链接 声明方式
自动 自动 块内
寄存器 自动 块内 使用关键字register
静态外部链接 静态 文件 外部 所有函数外
静态内部链接 静态 文件 内部 所有函数外 使用关键字register
静态无链接 静态 块内 使用关键字register

auto: 默认情况下 声明在块内和函数头中的变量都是auto类型的变量   也可以显式的在变量声明时写上auto auto变量在使用时在栈上申请空间 使用结束后自动销毁

register:寄存器变量存储在寄存器中

static:对于局部变量来说 声明为static 在使用时只会声明一次  之后不会再声明 对变量的改变会被保存(对它进行改变是在定义改变量的块中 或者通过变量的指针)这样改 局部变量具有了静态存储期

对于外部变量(具有文件作用域的变量)来说 static会将该变量声明为内部链接

extern:用extern声明 表明变量定义在别处  (extern也是声明 是引用性声明 不是定义性声明)

在使用另外一个文件中的全局变量时要用extern声明   这让人有些迷惑 前面说 声明为外部变量(未加static)具有全局作用域 那不就是能被其它文件使用了吗  这样的想法是错误的

c primer puls解释的很清楚 :如果外部变量定义在一个文件中,那么其它文件在在使用该变量前必须先声明它(用extern声明)。也就是说,在某文件中对外部变量进行定义式声明只是单方面允许其它文件使用改变量,其它文件在用extern声明之前不能直接使用它

对于自动变量来说 未初始化 它中的数据是垃圾

对于具有静态生存期的变量来说 如果未初始化 它里面的数据为0

例子:

main.c

 #include <stdio.h>
void fun();
int main()
{
fun();
fun();
return ;
}
void fun()
{
int num2=;
static int num1;
printf("num1 is:%d\n",num1);
printf("num2 is:%d\n",num2);
num1++;
num2++;
}

输出结果:

可以看到 num1保存了上次的值

 //file1.c
int num1=;
static int num2=; //file.c
#include <stdio.h>
extern int num1;
extern int num2; //这句话只是说明num2是定义在另一个文件中的 但num2是不具有外部
//链接的 所以下面是无法使用的
int main()
{
printf("%d",num1);
//printf("%d",num2); //这句话是错的
return ;
}
 //file1.c
#include<stdio.h>
void fun()
{
printf("fun()");
} //file2.c
#include <stdio.h>
extern void fun();
int main()
{
fun();
return ;
}

extern也可以对函数进行引用式声明

C语言中static extern的使用的更多相关文章

  1. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  2. C语言中static的使用方法【转】

    本文转自:http://blog.csdn.net/renren900207/article/details/21609649 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量 ...

  3. c语言中static 函数和普通函数的区别

    C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放 ...

  4. C语言中static用法介绍

    C语言中static用法介绍     对于新手来说,很多东西的用法还不是很清楚,我们今天一起来看看C语言中static用法介绍     1.声明了static的变量称为静态变量,根据作用域的不同又分为 ...

  5. C语言中static关键字的作用

    static的作用(精辟分析) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加sta ...

  6. C语言中static作用

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...

  7. C语言中static关键字的用法

    C记得还是大一时学的,现在觉得好久没用了,又捧起来看看.今天刚看到有关static关键字,仔细地看了一遍<C和指针>这本书中的解释,现在觉得清楚多了. 首先,我们将static关键字,修饰 ...

  8. 在不同语言中static的用法

    static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...

  9. 对C语言中static的理解

    对C语言中的static关键字的深入理解 在一次面试的时候面试官问我static全局变量与全局变量的区别,之前虽然用过但是并没仔细去搞懂他,这次来细心的学习一下. 基本概念 使用static有三种情况 ...

随机推荐

  1. Oracle 11g rac开启归档

    Oracle 11g rac开启归档 查看目前归档状态 #节点1 ykws1 SQL> archive log list; Database log mode No Archive Mode A ...

  2. css3 HSLA 颜色制造半透明效果

    简介 HSL色彩模式是工业界的一种颜色标准,是通过对色调(H).饱和度(S).亮度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,HSL即是代表色调,饱和度,亮度三个通道的颜色, ...

  3. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  4. 事务的隔离级别,mysql中开启事务、django中开启事务

    目录 一.事务的特性 二.数据库中开启事务 三.Django中开启事务的两种方式 第一种 第二种 四.事务的隔离级别 隔离级别 如何查看mysql隔离级别? 修改事务的隔离级别 隔离级别解释 read ...

  5. (转)协议森林10 魔鬼细节 (TCP滑窗管理)

    协议森林10 魔鬼细节 (TCP滑窗管理) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在TCP协议与"流" ...

  6. libfastcommon总结(〇)

    libfastcommon提供众多基础功能,该系列笔记将进行学习介绍. load_local_host_ip_addrs 进行加载主机上所有网卡的IPv4的地址. iniLoadFromFile 从文 ...

  7. 公钥体系(PKI)等密码学技术基础

    公钥体系(PKI)等密码学技术基础 公钥体系(Public Key Infrastructure, PKI)的一些概念 对称密码算法, 典型算法:DES, AES 加解密方共用一个密钥 加/解密速度快 ...

  8. Html的总结(待完善)

    Html的总结(待完善) 框内文字 Placeholder 框内文字(例如:请输入密码) A标签 link 未点击的A标记 visited 点击过的A标签 hover 放置鼠标变颜色 active 点 ...

  9. Natas6 Writeup(PHP Include)

    Natas6: 该题提供了php源码,点击查看分析,发现调用了includes/secret.inc页面,在输入一个变量secret后,如果和includes/secret.inc中 预设的secre ...

  10. Java基础 - 数据类型和运算符

    Java 语言支持的类型分为两类:基本数据类型(Primitive Type)和引用类型(Reference Type). 目录 基本数据类型 数值类型 整数类型 byte short int lon ...