变量的存储方式及作用域
来源:互联网 发布:快客淘宝软件 编辑:程序博客网 时间:2024/06/11 02:30
C、C++、OC编译的程序占用内存的分布结构如下图所示:
栈区(stack),先进后出、后进先出。由系统自动分配,一般存放函数参数值、局部变量值等,由编译器自动创建与释放。
堆区(heap),大小可变。程序员手动向系统申请并指明大小,并且手动释放。若不释放,程序结束时可能会由OS回收。操作系统有一个记录空闲内存地址的链表,当接收到程序分配内存的申请时,系统遍历链表找到一个大小大于申请内存的空闲内存地址纪录时,从该链表中删除该节点,并将该节点记录的内存地址分配给程序。
全局区/静态区:全局变量和静态变量存储于该区域。不过初始化的全局变量和静态变量存储在一块,未初始化的全局变量和静态变量存储在一块。程序结束后由系统释放。
文字常量区:主要存储字符串常量。程序结束后由系统释放。
程序代码区:主要存放二进制代码。
前辈的经典代码:
//main.cppint a = 0; // 全局初始化区char *p1; // 全局未初始化区main { int b; // 栈 char s[] = "abc"; // 栈 char *p2; // 栈 char *p3 = "123456"; // 123456\0在常量区,p3在栈上 static int c =0; // 全局静态初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区 strcpy(p1, "123456"); // 123456\0在常量区,这个函数的作用是将"123456" 这串字符串复制一份放在p1申请的10个字节的堆区域中。 // p3指向的"123456"与这里的"123456"可能会被编译器优化成一个地址。}
1、变量的作用域即变量声明后可访问到该变量的范围。分为全局变量、局部变量、外部变量三种。
全局变量,从该变量的声明起到本文件的结尾均可访问,作用域内其它的类、函数均可对其进行读、写。存放于全局/静态区;
局部变量,只在相应的函数体内,从该变量的声明起到函数体的结尾可访问,作用域内可对其进行读、写。存放于栈区;
外部变量,不仅在本文件中可以访问,在其它文件中也可访问,作用域内的类、函数均可对其进行读、写。存放于全局/静态区;
成员变量,类对象的成员变量,C++中有private、protect、public三种,oc中public成员变量由public实现,protect、private由成员变量位置决定。对内来说,成员变量对于该类对象的所有类方法、对象方法均有效;对外则要根据关键字及声明位置来决定其对外作用域。存放于堆区;
同一文件中,当全局变量与局部变量相遇,局部变量会屏蔽全局变量。
2、变量的存储方式即该变量究竟对应于物理内存哪种区域。C语言四种存储类型:自动存储变量、静态存储变量、外部存储变量、寄存器存储变量。
自动存储变量,作用域为变量定义所在的模块或函数内,生存期为该变量声明所在的函数或模块的执行周期,存储区域则一般位于栈区。缺省关键字为auto。存放于栈区;
静态存储变量,作用域为变量原来的作用域,存储区域则指定位于全局区/静态区,而生存期则变为整个应用程序的生命周期。关键字为static。存放于全局/静态区;
外部存储部量,使用extern来引用声明于别文件的变量,作用域为整个应用程序,生存期为整个应用程序的生命周期。存放于全局/静态区;
寄存器存储变量,寄存器存取效率更高,常用于循环控制,使用SI、DI寄存器。
- 变量的存储方式及作用域
- C语言之变量的作用域及存储方式
- 变量的作用域和存储方式
- 变量的作用域和存储方式
- C语言变量、函数的作用域及变量的存储方式
- C语言精华记录——壹(变量的作用域及存储方式)
- 变量的存储类别及生存期申明方式和作用域
- C语言精华记录——壹(变量的作用域及存储方式)
- c语言变量的存储方式(auto,register,static,extern)及作用域(局部变量/全局变量)详解
- 对变量存储类型及作用域的小结
- C中变量的存储类型及作用域
- 各种变量的存储区域及作用域
- 2.2变量及变量的作用域
- 简明C语言教程(十九)变量的作用域和存储方式
- 变量的作用域和存储期
- 变量的存储分配与作用域
- 变量的存储与作用域
- 变量的存储分配与作用域
- linux安装cuda
- ZOJ 1516 Uncle Tom's Inherited Land
- 资产借用归还提醒、员工生日及入职满几年的祝福及祝贺
- Windows Server 2008 下Oracle 11g 定时备份任务
- JAVA 对象序列化
- 变量的存储方式及作用域
- “印刷文化”的光环,没我们想得那么荣耀
- java面试题
- 九章算法面试题20 寻找重复的URL
- 自动消失的弹窗效果
- 个人经验总结:MySQL数据库优化技巧集锦
- Differences in Addressable Memory
- string and stringstream
- Maven安装jar