变量的作用域

1.局部变量

概念

局部变量就是定义在函数, 代码块和函数形参列表中的变量, 我们就称之为局部变量

作用范围

从定义的那一行开始一直直到遇到大括号结束或者遇到return为止

特点:

相同作用域范围内不能出现同名的局部变量
不同作用域范围内出现同名的局部变量, 内部的局部变量会覆盖外部的局部变量

注意:

局部变量没有固定的初始化值, 如果没有对局部变量进行初始化, 那么局部变量中是一些随机的值, 所以在开发中千万不要使用未初始化的局部变量

存储位置:

局部变量存储在栈中, 当作用域结束系统会自动释放栈中的局部变量

2.全局变量

概念

写在函数,代码块,形参列表外的变量, 我们就称之为全局变量
作用范围: 从定义的那一行开始一直直到文件末尾(暂时这样认为)

特点

全局变量和局部变量可以同名
如果存在和全局变量同名的局部变量, 那么局部变量会覆盖全局变量

注意:

全局变量如果没有进行初始化, 那么系统默认会将全局变量初始化为0

存储位置:

全局变量存储在静态区中, 他会随着程序的启动而创建, 随着程序的结束而结束

3.内部全局变量和外部全局变量

(1)全局变量分为两种:

1)外部全局变量, 默认情况下所有的全局变量都是外部全局变量
什么是外部全局变量? 可以被其它文件访问的全局变量我们称之为外部全局变量
2)内部全局变量, 只要给全局变量加上static关键字就是内部全局变量
什么是内部全局变量? 只能被当前文件访问的全局变量我们称之为内部全局变量

(2) 外部全局变量有一个特点:

  可以定义同名的外部全局变量
  多个同名的外部全局变量指向同一块存储空间

内部全局变量有一个特点

  也可以定义多个同名的内部全局变量
  多个同名的全局变量如果不在同一个文件中, 那么指向不同的存储空间

(3)static

为了提高数据的安全性, 不让别人在其它文件中修改我们的全局变量,
 C语言提供了另外一个用于修改全局变量的关键字, static

 只要用static修改的全局变量就是内部全局变量, 只能在当前文件中使用
 这样就可以提高我们全局变量的安全性
 
 如果多个文件中存在同名的内部全局变量, 相互不会影响
 如果既有外部全局变量也有内部全局变量, 那么会优先访问内部全局变量
 
 extern:
    用于声明一个外部全局变量
    声明只需要在使用变量之前声明就可以了
 static:
    用于定义一个内部全局变量

(4)声明和定义的区别:

声明不会开辟存储空间
定义会开辟存储空间

4.static对局部变量的作用

(1)当使用static来修饰局部变量, 那么会延长局部变量的生命周期, 并且会更改局部变量存储的位置 , 将局部变量从栈转移到静态区中
(2)只要使用static修改局部变量之后, 当执行到定义局部变量的代码就会分配存储空间, 但是只有程序结束才会释放该存储空间,静态区地址赋值后不能更改。

5.extern和static对函数的作用

(1)函数也分为内部函数和外部函数

     默认情况下所有的函数都是外部函数
     什么是外部函数? 可以被其它文件访问的函数称之为外部函数
     什么是内部函数? 只能在当前文件中访问的函数称之为内部函数

(2) 只要在函数的返回值前面加上一个extern就可以让函数变为一个外部函数, 由于默认就是外部函数, 所以在开发中一般情况extern没人写

      如果extern写在函数的实现中, 代表定义一个外部函数
      如果extern写在函数的声明中, 代表声明一个外部函数

(3) 只要在函数的返回值前面加上static就可以让函数变为内部函数, 其它文件就不能访问了

     如果static写在函数的实现中, 代表定义一个内部函数
     如果static写在函数的声明中, 代表声明一个内部函数

5.const的用法

(1) const在指针中的用法

 如果const写在指针类型的左边, 那么意味着指向的内存空间中的值不能改变, 但是指针的指向可以改变
 如果const写在指针的数据类型和*号之间, 那么意味着指向的内存空间中的值不能改变, 但是指针的指向可以改变
 如果const写在指针的右边(数据类型 * const), 那么意味着指针的指向不可以改变, 但是指针指向的存储空间中的值可以改变
const char *name = "lnj";
int const *p = #
int * const p = #

(2) const对基本数据类型的作用

 const对基本数据类型的作用, 可以让基本数据类型的变量变为常量
 const有两种写法, 1.写在数据类型的左边, 2.写在数据类型的右边

 const int num = 10;
 int const num = 10;  

6.成员变量、全局变量和局部变量对比

(1)写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量)

   成员变量只能通过对象来访问
   注意: 成员变量不能离开类, 离开类之后就不是成员变量 
            成员变量不能在定义的同时进行初始化
   存储: 堆(当前对象对应的堆的存储空间中)
   存储在堆中的数据, 不会被自动释放, 只能程序员手动释放,或者等对象释放的时候,它也会释放

(2)写在函数和大括号外部的变量, 我们称之为全局变量

   作用域: 从定义的那一行开始, 一直到文件末尾
   局部变量可以先定义在初始化, 也可以定义的同时初始化
   存储: 静态区
   程序一启动就会分配存储空间, 直到程序结束才会释放

(3)写在函数或者代码块中的变量, 我们称之为局部变量

       作用域: 从定义的那一行开始, 一直到遇到大括号或者return
       局部变量可以先定义再初始化, 也可以定义的同时初始化
       存储 : 栈
       存储在栈中的数据有一个特点, 系统会自动给我们释放

7.iOS中全局变量的几种使用方法

(1)在AppDelegate中声明并初始话全局变量
在需要使用的地方插入以下代码,在ios中 AppDelegate被设计成了单例模式

AppDelegate *appDelegate = [[UIApplication shareApplication] delegate];  
appDelegae.your_var  

(2)使用extern关键字,extern可以理解为外部引入的意思

1、单独新建一个example.h文件,文件名自己取,用于存放所有的全局变量
2、在该文件中写入你要定义的变量名,定义时不能初始化,如:
NSString *str;
int number;
3、在需要使用的地方引入头文件
#import "example.h"
4、给全局变量初始化或者赋值
extern NSString *str = [[NSString alloc] initWithFormat:@"abcd"];
extern int number = 1;

(3)使用单例

interface Singleton : NSObject  

  
+ (Singleton *)sharedSingleton;  
@property (nonatomic,copy) NSString *testGlobal; 
  
  
@end  
  
@implementation Singleton  

  
  
+ (Singleton *)sharedSingleton  
{  
  static Singleton *sharedSingleton;  
  
  @synchronized(self)  
  {  
    if (!sharedSingleton)  
      sharedSingleton = [[Singleton alloc] init];  
  
    return sharedSingleton;  
  }  
}  
  
@end  

使用如:
[Singleton sharedSingleton].testGlobal = @"test";

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • Javascript 这门语言与其他的大部分语言相比,有很多特殊性,这是很多人喜欢它或者讨厌它的原因。其中变量的作...
    范斌阅读 1,205评论 0 51
  • 变量的定义:变量就是计算机的内存单元; 变量的名称定义:变量的名称就是计算机内存单元的名称 | 指针,也可以理解为...
    彭晓华阅读 394评论 0 1
  • 变量的作用域指的是,变量起作用的范围。也就是能访问到变量的有效范围。JavaScript的变量依据作用域的范围可以...
    壬万er阅读 293评论 0 1
  • 所谓刻砖刘、泥人张、风筝魏、机器王、刷子李等,时间久了这些姓和拿手行当连在一起称呼的牛人,他们的名字没人知道,就一...
    梦回匠人阅读 649评论 2 5
  • 小说和技术类书籍:53本 读书还可以。补全了诛仙系列。漫画:火影忍者 死神 完结补全了进击的巨人、猎人、七龙珠、棒...
    惟有进步值得信仰阅读 265评论 0 0