main.c

#include <stdio.h>
#include "zs.h"
/*
局部变量是定义在函数、代码块、函数形参列表。存储在栈中,从定义的那一行开始作用域结束释放。 全局变量:写在函数,代码块,形参列表外的变量,从定义的那一行开始一直直到文件末尾(暂时这样认为),全局变量如果没有进行初始化是0,存储在静态区中, 随着程序的结束而结束。
*/ /*
全局变量分为两种:
1.外部全局变量:
可以被其它文件访问的全局变量我们称之为外部全局变量(默认情况下所有的全局变量都是外部全局变量。)。 多个同名的外部全局变量指向同一块存储空间。
2.内部全局变量:
只能被当前文件访问的全局变量我们称之为内部全局变量。只要给全局变量加上static关键字就是内部全局变量,多个同名的内部全局变量如果不在同一个文件中,那么指向不同的存储空间。 */ /*
为了提高数据的安全性, 不让别人在其它文件中修改我们的全局变量, static修改的全局变量就是内部全局变量, 只能在当前文件中使用
这样就可以提高我们全局变量的安全性。 如果多个文件中存在同名的内部全局变量, 相互不会影响
如果既有外部全局变量也有内部全局变量, 那么会优先访问内部全局变量 extern:
用于声明一个外部全局变量
声明只需要在使用变量之前声明就可以了,声明不会开辟存储空间
static:
用于定义一个内部全局变量,定义会开辟存储空间 */ int num; // 外部全局变量,可以定义多个同名的全局变量,
int num;
int num; static int num; // 内部全局变量 998 int main(int argc, const char * argv[]) {
num = ;
test();
printf("mian.c = num = %i\n", num);
return ;
}

zs.c

#include "zs.h"

/*
int num; // 不允许,由于Xcode升级之后检验导致的, 在Xcode6以前是可以的
如果直接在zs.c当中定义外部全局变量num, 那么我们说过同名的外部全局变量指向同一块存储空间,
那么如果在多个文件中有同名的外部全局变量, 可能导致A文件的数据被B文件不小心修改了
降低了数据的封装性, 提高了发生错误的概率,所以不建议在不同的文件写同名的全局变量。
*/ // extern代表声明一个全局变量,注意:声明全局变量和声明函数一样,仅仅是告诉系统我们有这个全局变量,但并不会真在的开辟存储空间。
extern int num; static int num; // 0 666 int num; // 0 666 void test()
{
extern int num;//声明也可以写在函数里面,只要在使用之前就可以。
printf("zs.c = num = %i\n", num); //
num = ;
}
int num;

zs.h

void test();

-----------------------------------------------------------------------------------------------------------------------------------------------

main.c

//
// main.c
// static对局部变量的作用 #include <stdio.h> void test()
{
int a = ; // 局部变量,栈里面 // 当使用static来修饰局部变量, 那么会延长局部变量的生命周期, 并且会更改局部变量存储的位置 , 将局部变量从栈转移到静态区中
// 只要使用static修改局部变量之后, 当执行到定义局部变量的代码就会分配存储空间, 但是只有程序结束才会释放该存储空间 static int b = ;//静态区
a++; //
b++; // 1 2
printf("a = %i\n", a); //
printf("b = %i\n", b); //
printf("------------\n");
} void demo(int r)
{
/*
应用场景":
当某个方法的调用频率非常高, 而该方法中更有些变量的值是固定不变的
那么这个时候就可以使用static来修饰该变量, 让该变量只开辟一次存储空间
这样可以提高程序的效率和性能
*/
static double pi = 3.1415926; // 固定
double res = pi * r * r;
printf("res = %lf\n", res);
}
int main(int argc, const char * argv[]) { test();//1,1
test();//1,2 for (int i = ; i < ; i++) {
demo(i);
} return ;
}

-----------------------------------------------------------------------------------------------------------------------------------------------

main.c

//
// main.c
// extern和static对函数的作用 #include <stdio.h>
#include "zs.h" //导入头文件就可以 void demo(); //由于demo函数没有加static默认所有文件都可以访问,所以在main中使用之前声明demo就可以了。不声明也可以访问。
/*
函数也分为内部函数和外部函数,
默认情况下所有的函数都是外部函数,
可以被其它文件访问的函数称之为外部函数,
只能在当前文件中范文的函数称之为内部函数。
*/
int main(int argc, const char * argv[]) { test();
demo();
return ;
} extend用在全局变量,表示声明一个全局变量不会开辟空间。
extend用于函数表示外部全局函数(一般不写,函数默认都是外部的)。 static用在全局变量表示定义一个内部全局变量,只能在本文件中使用。
static用在局部变量表示把局部变量放在静态区,多次引用是同一个。
static用在函数表示内部函数,只在本文件中使用。

zs.h

//
// zs.h
// day10 void test();
extern void test(); // 在.h中声明一个内部函数没有任何意义,因为别人看得到但是用不了。
static void demo();

zs.c

//
// zs.c
// day10 #include "zs.h" // 声明内部函数一般用于内部函数定义在后面, 而想在定义之前使用内部函数
static void demo(); // 只要在函数的返回值前面加上一个extern就可以让函数变为一个外部函数, 由于默认就是外部函数, 所以在开发中一般情况extern没人写
// 如果extern写在函数的实现中, 代表定义一个外部函数
// 如果extern写在函数的声明中, 代表声明一个外部函数
extern void test()
{
printf("test printf\n");
demo();
} // 不加static默认所有文件都可以访问。static让函数变为内部函数, 其它文件就不能访问了。
// 如果static写在函数的实现中, 代表定义一个内部函数
// 如果static写在函数的声明中, 代表声明一个内部函数
static void demo()
{
printf("demo printf\n");
}

局部变量,全局变量,extend,static的更多相关文章

  1. IOS 成员变量,全局变量,局部变量定义,static与extern的区别

    IOS 成员变量,全局变量,局部变量定义,static与extern的区别 1,先说定义 1)成员变量定义:生存与该类的生命周期,变量存活周期跟你定义的该类实体对象一样:作用域是整个实体对象:可以在h ...

  2. C_局部变量&全局变量

    2018-5-9   Writen By Stephen.Yu  一.定义 1. 局部变量:在函数中定义的变量 2. 全局变量:在所有函数体之外定义 定义(Definition):声明并分配内存;未分 ...

  3. static静态全局变量和static静态局部变量

    static静态全局变量: 静态全局变量就是将全局变量变成静态的.如何变?——全局变量加个static. static就是一个存储类说明符,a这个全局变量就成了一个静态全局变量了. 静态全局变量的特点 ...

  4. c语言局部变量 静态局部变量 全局变量与静态全局变量

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  5. 11.全局变量(static)

    1.数组 数组名是常量 2. 指针数组 4.局部变量 (1).作用域 作用的范围: (2).普通局部变量 在{}内定义: 只有执行到定义变量的这个语句,系统才会给这个变量分配空间. 当离开{},这个非 ...

  6. Java中的static修饰int值做全局变量与static修饰词初始化顺序

    先看一道题 public class HasStatic{ private static int x=100; public static void main(String args[]){ HasS ...

  7. iOS 局部变量 全局变量 成员变量

    一.成员变量 : 写在类声明的大括号中的变量叫成员变量 (也叫属性/实例变量) 成员变量不可离开类 离开了类就不是成员变量 成员变量不能再定义的同事初始化 成员量只能通过对象来访问 成员变量存储在堆中 ...

  8. 关于全局变量,static,define和const

        其实按照现在主流的观点,应该尽量少用全局变量和define,尽量多用临时变量,并且用const替换值define,用短小精悍的函数替换函数define.     对这些我倒是也没有什么意见,只 ...

  9. day10 局部变量 全局变量 作用域前奏

    规则命名以及基本介绍 name="LHF" # 顶头写的全局都可以调用的就是全局变量,命名规则要求大写全局变量 def chang_name(): # global name # ...

  10. day 3 局部变量 全局变量

    1.局部变量 2.全局变量(死歌的大招)函数前面声明的都是全局变量 3.全局变量和局部变量的区别 1)老方法 def get_temper(): temper = 33 return temper d ...

随机推荐

  1. angular js 球星

    <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="UTF ...

  2. HTML 5概述

    HTML语言是一种简易的文件交换标准,用于物理的文件结构,它旨在定义文件内的对象和描述文件的逻辑结构,而并不定义文件的显示.由于HTML所描述的文件具有极高的适应性,所以特别适合于WWW的出版环境. ...

  3. ★Java语法(六)——————————分支语句

    1. if 语句   格式用法: if(布尔表达式) { 语句: } 2. if……else  语句 格式用法: if(表达式) { 语句1: } else { 语句2: } 3.if……else i ...

  4. Linux while和for循环简单分析

    一.循环重定向 最近遇到了一种新的循环重定向写法,由于没看懂,说以网上搜索了一下,然后再此分享一下: while read line do ...... done  < file 刚开始看,不明 ...

  5. js对cookie增删改查的封装

    /** * 获取cookie * @param name * @returns {*} */ function getCookie(name) { var cookieArr = document.c ...

  6. 用了那么多项目管理工具,还是CORNERSTONE这款最好用

    在与软件开发有关的项目,往往会出现很难管理情况.许多事情都需提前计划.控制与管理,所以许多项目经理很容易迷失在计划的过程中.幸运的是,市场上提供了各种各样的项目管理工具.但不幸的是,工具实在是太多了. ...

  7. react新版本生命周期

    给componentWillMount componentWillReceiveProps componentWillUpdate生命周期加上UNSAFE_前缀,表明其不安全性,并将在未来版本将其移除 ...

  8. 团体程序设计天梯赛-练习集-L1-048. 矩阵A乘以B

    L1-048. 矩阵A乘以B 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有Ra行.Ca列,B有Rb行.Cb列,则只有Ca与Rb相等时,两个矩阵 ...

  9. python tips:作用域与名字空间

    Python具有静态作用域,变量的作用域由它定义的位置决定,而与调用的位置无关. a = 2 def f(): a = 2 第一行的a的作用域是全局作用域,作用于定义位置后面的所有位置. 第四行的a的 ...

  10. javascript匿名函数及闭包深入理解及应用

    1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...