【黑马程序员】C语言学习笔记之变量与内存(五)
来源:互联网 发布:淘宝部分退款返利 编辑:程序博客网 时间:2024/05/16 08:19
--------------------------------------------IOS期待与您交流!--------------------------------------------
一、字节和地址
- 计算机中的内存是以字节为单位的存储空间。内存的每一个字节都有一个唯一的编号,这个编号就称为地址。就好像酒店是以房间为单位的,每个房间都有一个唯一的房号,我们根据房号就能找到对应的房间。
- 一个字节有8位,所能表示的数据范围是非常有限的,因此,范围较大的数据就要占用多个字节,也就是说,不同类型的数据所占用的字节数是不一样的。
二、变量的存储
1>变量类型的作用
任何变量都必须先定义类型再使用。为什么一定要先定义呢?因为变量的类型决定了变量占用的存储空间,所以定义变量类型,就是为了给该变量分配适当的存储空间,以便存放数据。
2>变量占用多少存储空间
2.2>在64位编译器环境下,基本数据类型所占用的存储空间
2.3>不同编译器环境下的存储空间占用情况
3>变量示例
当定义一个变量时,系统就会为这个变量分配一定的存储空间。int main(){ char a = 'A'; int b = 10; return 0;}1> 在64bit编译器环境下,系统为变量a、b分别分配1个字节、4个字节的存储单元。也就是说:
变量b中的10是用4个字节来存储的,4个字节共32位,因此变量b在内存中的存储形式应该是0000 0000 0000 0000 0000 0000 0000 1010。
变量a中的'A'是用1个字节来存储的,1个字节共8位,变量a在内存中的存储形式是0100 0001。
2> 上述变量a、b在内存中的存储情况大致如下表所示:
(注:"存储的内容"那一列的一个小格子就代表一个字节,"地址"那一列是指每个字节的地址)
从图中可以看出,变量b占用了内存地址从ffc1~ffc4的4个字节,变量a占用了内存地址为ffc5的1个字节。每个字节都有自己的地址,其实变量也有地址。变量存储单元的第一个字节的地址就是该变量的地址。变量a的地址是ffc5,变量b的地址是ffc1。
内存寻址是从大到小的,也就是说做什么事都会先从内存地址较大的字节开始,因此系统会优先分配地址值较大的字节给变量。由于是先定义变量a、后定义变量b,因此你会看到变量a的地址ffc5比变量b的地址ffc1大。
注意看表格中变量b存储的内容,变量b的二进制形式是:0000 0000 0000 0000 0000 0000 0000 1010。由于内存寻址是从大到小的,所以是从内存地址最大的字节开始存储数据,存放顺序是ffc4 -> ffc3 -> ffc2 -> ffc1,所以把前面的0000 0000都放在ffc2~ffc4中,最后面的八位0000 1010放在ffc1中。
4>查看变量的内存地址
int main(){ int a; printf("a的地址是:%p", &a);}%p是用来输出地址的,&是取址运运算符,&a表示取出变量a的地址
三、变量的作用域
1>作用域简介
变量的作用域就是指变量的作用范围。先来看看下面的程序:int main(){ int a = 7; return 0;}在第3行定义了一个变量a,当执行到这行代码时,系统就会为变量a分配存储空间
当main函数执行完毕,也就是执行完第5行代码了,变量a所占用的内存就会被系统自动回收
因此,变量a的作用范围是从定义它的那行开始,一直到它所在的大括号{}结束,也就是第3~6行,一旦离开这个范围,变量a就失效了
2>代码块
2.1> 代码块其实就是用大括号{}括住的一块代码。
int main(){ { int a = 10; printf("a=%d", a); } a = 9; return 0;}注意第3~7行的大括号,这就是一个代码块
当执行到第4行时,系统会分配内存给变量a
当代码块执行完毕,也就是执行完第6行代码后,变量a所占用的内存就会被系统回收
因此,变量a的作用范围是从定义它的那行开始,一直到它所在的大括号{}结束,也就是第4~7行,离开这个范围,变量a就失效了
所以,上面的程序是编译失败的,第9行代码是错误的,变量a在第7行的时候已经失效了,不可能在第9行使用
2.2> 如果是下面这种情况
int main(){ int a = 9; { int a = 10; printf("a=%d", a); } return 0;}注意第3、6行,各自定义了一个变量a,这种情况是没问题的。C语言规定:在不同作用域中允许有同名变量,系统会为它们分配不同的存储空间。
在第3行定义的变量a的作用域是:第3~12行;在第6行定义的变量a的作用域是:第6~9行。
最后注意第8行:尝试输出变量a的值。那这里输出的是哪一个变量a呢?先看输出结果:
a=10
这里采取的是“就近原则”,也就是第8行访问的是在第6行定义的变量a,并不是在第3行的变量a。
四、变量的初始化
变量在没有进行初始化之前,不要拿来使用,因为它里面存储的是一些垃圾数据
--------------------------------------------IOS期待与您交流!--------------------------------------------
详细请查看:http://edu.csdn.net
0 0
- 【黑马程序员】C语言学习笔记之变量与内存(五)
- 黑马程序员IOS基础---C语言学习之变量与内存及重要的scanf函数
- 黑马程序员-C语言笔记(五)内存
- 黑马程序员---C语言学习笔记之五
- 【黑马程序员】C语言学习笔记之常量和变量(四)
- 黑马程序员-------c语言学习笔记之数组与字符串
- 黑马程序员之--C语言学习笔记之变量、常量和注释
- 【黑马程序员】C语言学习笔记之函数(八)
- 【黑马程序员】C语言学习笔记之数组(九)
- 【黑马程序员】C语言学习笔记之指针(十一)
- 【黑马程序员】C语言学习笔记之字符串(十)
- 【黑马程序员】C语言学习笔记之枚举(十三)
- 【黑马程序员】C语言学习笔记之typedef(十五)
- 黑马程序员-----c语言学习笔记之预处理指令、函数、变量
- 黑马程序员---C语言学习笔记之变量地址获取及存储原理
- 黑马程序员——c语言学习---变量与存储
- 黑马程序员之IOS学习总结——01C语言中的常量与变量
- 黑马程序员---C语言之进制与内存剖析
- UML--UML类图关系大全
- unity中Invoke()使用
- C#的反射中使用带参的构造函数进行构建对象
- UML--UML类图几种关系的总结
- Android自学笔记-9-Pull方式处理XML
- 【黑马程序员】C语言学习笔记之变量与内存(五)
- 2014年3月份c++复习总结
- 华为机试题---二维数组的转置
- XP 怎样建立宽带连接
- eclipse中用maven需要注意JDK的配置
- ADO.NET
- 面向对象核心思想和概念
- 编程菜鸟的技术博客
- Medoo Quote的使用:转义字符串