iOS基础:全局变量·静态变量·局部变量·自动变量(static、extern、全局静态区、堆区、栈区)

引言:包括百度、中兴在内的很多公司都曾在笔试面试中出过下面题目

  • 问题:全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

  • 解析:有区别。全局变量保存在内存的全局存储区中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。

区分三种变量的特点,如果只看声明位置和访问范围,肯定不够深刻的,需要进一步理解在内存中的不同。所以,这里我们来复习总结一下三种变量的特点,区分巩固基础知识。

1. 全局变量

1.1 全局变量
  • 函数外面声明
  • 可以跨文件访问
  • 可以在声明时赋上初始值
  • 如果没有赋初始值,系统自动赋值为0
  • 存储位置:既非堆,也非栈,而是专门的【全局(静态)存储区static】!

注意

例如,我们在A类中声明和定义一个全局变量lastNum,类似如下

float lastNum;//仅声明
float lastNum = 10.0;//声明和定义
1.2 关于extern关键字

要注意的是,全局变量可以在许多地方声明extern,但定义(赋初值)只能一次。而上面的代码既声明,也定义了一个全局变量lastNum。其中,定义的时候并不需要extern专门来修饰。倒是在其他不需要定义该全局变量的地方,需要extern来修饰该全局变量,声明要调用外部变量了。

用法1

  • 我们在B类想调用A类中声明和定义的全局lastNum时,并且B类也没有导入A类,这时,需要在B类中做extern float lastNum;这样声明。这样就告诉系统,我要访问其他文件中定义的这个全局变量了。注意点:此时,B类通过extern调用A类声明的全局变量时,B类中并不需要导入A类,例如类似import A.h等等

A.m 中定义和声明全局变量

image.png

B.m 中extern并调用全局变量

image.png

用法2.

  • 我们在A.m文件中声明和定义的全局lastNum时,同时在A.h文件中做extern float lastNum;这样的声明。在需要在B类中导入A类头文件,就不需要在B类中专门做extern float lastNum;这样的声明了。这样就告诉系统,其它访问A文件中定义的这个全局变量了,导入A类即可使用。

A.m 中声明全局变量

image.png

A.h中extern全局变量

image.png

B.m中importA.m类并调用全局变量

image.png

2. 静态变量

  • 函数外面 或 内部声明(即可修饰原全局变量亦可修饰原局部变量)
  • 仅声明该变量的文件可以访问
  • 可以在声明时赋上初始值
  • 如果没有赋初始值,系统自动赋值为0
  • 存储位置:既非堆,也非栈,而是专门的【全局(静态)存储区static】!
static float lastNum;
static float lastNum = 10.0;

3. 局部变量(自动变量)

  • 函数内部声明
  • 仅当函数执行时存在
  • 仅在本文件本函数内可访问
  • 存储位置:自动保存在函数的每次执行的【栈帧】中,并随着函数结束后自动释放,另外,函数每次执行则保存在【栈】中
- (float)caculateResult{
 float a = 1.0;
 float b = 2.0;
 return a + b;
}

4. 内存分区

堆和栈首先要清楚的是程序对内存的使用分为以下几个区:

  • 栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。
  • 堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。与数据结构中的堆是两码事,分配方式类似于链表。
  • 全局区(static):全局变量和静态变量存放在此。
  • 文字常量区:常量字符串放在此,程序结束后由系统释放。
  • 程序代码区:存放函数体的二进制代码。

5. 后面的话

  • 与全局变量相比,静态变量存储位置一样,声明位置如果也一样(函数外部),静态变量这时跟全局变量有什么区别?就是为了限制访问范围,静态变量仅当前声明该变量文件里面的代码可以访问。而全局变量可以同一工程跨文件访问,可能会引起严重的混淆问题。
  • 区分:内存结构(计算机系统原理)里面的【堆】跟数据结构(算法与数据结构)里面的【堆】是两回事

6. 拓展阅读

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