iOS开发技能树之C语言-存储方式、类别

存储方式

C语言根据变量的生存周期来区分,分为静态存储方式和动态存储方式。

  • 静态存储方式:在程序运行期间分配固定存储空间的方式。静态存储区存放了在整个程序执行过程中都存在的变量,如全局变量。
  • 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数、自动变量、函数调用时的现场保护和返回地址等。

在内存中的用户存储空间分为:程序区、静态存储区、动态存储区。

存储类别

C语言中的存储类别分为四类:自动(auto)、静待(static)、寄存器(register)、外部的(extern)。

1、auto 自动变量 --局部变量

auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。

函数的形参在函数中定义的局部变量(包含在符合语句中定义的局部变量),都是自动变量auto。存储在内存的动态存储区中。

int funny (int a) { /*定义函数,a为参数/形参*/
    auto int b ,c; /*定义b,c自动变量*/
    /*....*/
}

2、static 静态变量

static修饰的是静态变量,如果定义在函数内部,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。

静态变量都存储于静态存储区。

  • 静态局部变量

1、静态局部变量在编译时赋初值,第一次赋值有效,以后在调用时,直接使用上一次调用的值而不需要重新赋值。

2、静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。

3、如果在定义局部变量时不赋初值的话,则静态变量在编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。

void funny (int a) {
    static int index = 1;
    index += 1;
    printf("funny :%d\n",index);
}

int main(int argc, const char * argv[]) {
    
    for (int i = 0; i < 5; i ++) {
        funny(10);
    }
    printf("********\n");
    funny(0);
    
    return 0;
}

打印结果:
funny :2
funny :3
funny :4
funny :5
funny :6
********
funny :7
  • 静态外部变量/静态全局变量

全局变量都是放在静态存储区中的。一般来说,外部变量是在函数外定义的全局变量,它的作用域是从变量定义处开始,到本程序文件末尾。

静态外部变量,是为了使某些变量只限于被本文件引用,而不能被其他文件引用。

1、static int a,变量只可以在当前文件中使用,

2、int a,只是全局变量,可以在整个工程中使用,其他文件引用时需要extern关键字声明

test.c

static int staticInt_test = 100;

int pInt_test = 200;
/*-----------------------*/
main.c

int main(int argc, const char * argv[]) {
    
    extern int pInt_test;/*可以通过extern关键字声明,之后可以直接使用test.c中声明的变量 */
    printf("test:%d\n",pInt_test); /*打印结果:200*/
    
    extern int staticInt_test ;/*如果声明的是全局静态变量,这里在编译时会报错,找不到对应变量。*/
    printf("test static:%d\n",staticInt_test); /* 报错 */
    return 0;
}

static对局部变量和全局变量的作用不同,对局部变脸来说它使变量由动态存储方式改为静态存储方式。对全局变量来说,它使变量局部化(局部于本文件),但仍为静态存储方式。
从作用域角度看,凡有static声明的,其作用域都是局限的,或者都是局限于本函数内(静态局部变量),或者局限于本文件内(静态外部变量)。

3、register 寄存器变量

为提高效率,C语言允许将局部变量的值放在CPU的寄存器中,这种变量叫“寄存器变量”,关键字register声明。

void funny () {
    register int i,sum = 0;//定义为寄存器变量
    
}

只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数据有限,不能定义任意多个寄存器变量,局部静态变量不能定义为寄存器变量

4、extern 外部变量

extern声明的变量是外部变量,表示把该变量的作用域扩展到此位置。外部变量的含义是某函数可以调用在该函数之后定义的变量。也可以调用其他文件中声明的外部变量。

  • 在一个文件内扩展外部变量的作用域
int main(int argc, const char * argv[]) {
    extern int count;
    printf("%d\n",count);
    
    return 0;
}

int count = 100;

打印结果:
100

/** 如果不作声明,将报错"Use of undeclared identifier 'count'" **/
  • 将外部变量的作用域扩展到其他文件,即在一个文件中引用另一个文件已经定义的外部变量
test.c

int pInt_test = 200;
/*-----------------------*/
main.c

int main(int argc, const char * argv[]) {
    
    extern int pInt_test;
    /*通过extern关键字声明,之后可以直接使用test.c中声明的变量 */
    printf("test:%d\n",pInt_test);
    /*打印结果:200*/
    
    return 0;
}

  • 作用

    1、在一个文件中扩展外部变量的作用域

    2、在一个文件中引用给另一个文件中已经定义的外部变量。

部分概念说明

数据存放的6中形式:

  • 1、程序代码区--存放程序编译后的可执行代码
  • 2、静态区(全局区)--全局变量和静态变量的存储是放在一起的,初始化的全局变量和初始化的静态变量在同一区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放
  • 3、常量区--常量存放位置,程序结束后由系统释放
  • 4、堆区--一般由程序分配和释放,如果程序不释放,程序结束时可能由操作系统回收(程序不正常结束则无法回收)
  • 5、栈区--由编译器自动分配并且释放,一般存放函数的参数、局部变量等
  • 6、寄存器区--有限容量的高速存储区,直接建立在中央处理器内部,用来暂存指令、数据和地址,一般用来保存栈顶指针、指令指针和现在正在被运行的指令。由于存储区其实是在中央处理器内部建立,不在内存中,因此不能将其划分到内存中。这里与内存的功能大致相同,都用来暂存数据。

---这部分说明来自博客

全局变量、局部变量

程序的编译单位是源程序文件,一个原文家可以包含一个或若干个函数。在函数内定义的变量是局部变量,在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。

全局变量可以为本文件中其他函数所共用,他的有效范围为从定义变量的位置到本源文件结束。

建议不再必要时不要使用全局变量:1、全局变量在程序执行的全部过程中都占用存储单元,而不是仅在需要时才开辟单元;2、使函数通用性降低;3、全局变量过多,降低程序的清晰性,难以清晰判断出每个瞬间各个外部变量的值。

作用域、生存期

一个变量的属性可以从两个方面分析,一个是作用域,一个事变量值存在时间的长短,即生存期。前者是从空间角度,后者是从时间角度。二者有联系,但不是同一回事。

如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域。在该作用域内可以引用该变量。

如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期,或称该变量在此时刻存在。

存储类别小结

1、从作用域角度分,有局部变量和全局变量


存储类别小结-作用域角度

2、从变量存在的时间(生存期)区分,有动态存储和静态存储两种类型


存储类别小结-按变量生存周期分

3、从变量值存储位置区分


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

推荐阅读更多精彩内容

  • 1、c语言的函数有以下特点: (1)才源程序由函数组成,一个主函数main()+若干其他函数 C程序中的函数类似文...
    滕王阁序阅读 1,329评论 0 6
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,299评论 8 265
  • 模拟器 沙盒 沙盒机制与文件(一) Xcode6的iPhone模拟器文件夹 每个文件夹都和某种模拟器相对应。为了知...
    plantAtree_dAp阅读 149评论 0 0
  • 1.环境越单调的独处是人与自己灵魂对话的最佳时机。目前更多的时候我感觉自己是被手机所绑架的,微信是时不时得刷一下的...
    yucatfish阅读 122评论 0 1
  • 生无可恋是个啥意思?活着都没意义,还要活着吗?死了算了吧!但是不能白死吧! 我找不到活着的乐趣,真烦人啊!我其实可...
    小鸽子饿了阅读 796评论 0 0