Day 1
虚拟内存空间模型(重点)
低地址–高地址
内存地址:
操作系统寻址处理数据最小单位是8位1个字节
所以内存地址指的是虚拟内存空间当中某一个字节的区域的唯一标识。
变量的地址:
1个int变量,它一般占用4个字节(虚拟内存空间的4个字节)
变量所占用内存空间的第一个字节的内存区域的唯一标识。
我们可以把虚拟空间想象成一个连续的数组,内存地址是唯一标识,可以看成是数组的下标
虚拟内存空间的地址(值)
在区间
(0,最大地址值)
低地址:靠近内存空间中地址最小的区域,就是低地址
高地址:靠近内存空间中地址最大堆区域,就是高地址
对于某个平台的虚拟内存空间来说,它的最大地址值是如何确定的?(X64,X86)
根据平台的架构确定
32位的平台
2^32/1024/1024/1024–4G(最大值)
地址总线是32位,意味着虚拟内存空间的内存地址有2^32种可能性
于是该地址的最大值就是(0,2^32-1)
我们一般习惯用16进制表示地址值
(0x0000 0000,0xFFFF FFFF)
其中,区间范围内的每一个十六进制数都恰好代表一个字节的内存区域
64位的平台
可寻址空间更大,内存地址值更大
32位平台的虚拟内存空间模型
现在有个int变量int a=10;
在内存中,整数是以有符号数的补码形式存储的
正数的原反补码是一样的
补码:
0000 0000 0000 0000 0000 0000 0000 1010
小端存储法
指的是在Intel/AMD等现代计算机架构中
选择在将此数据的低有效位,存储在虚拟空间的低有效位
所以10这个整数在虚拟内存空间中的存储是:
从低地址到高地址
0000 1010 00000000000000000…
大端存储法
将此数据的高有效位放在低地址上
大端存储法在网络传输过程中使用
前端
B/S(Browser-Server)架构
C/S(Client-Server)架构C++(QT框架,支持跨平台开发)
客户端开发:桌面客户端开发,移动客户端开发
后端,也叫服务器端
变量
内存角度:变量的存储空间,究竟长什么样子,占多少内存,存什么数据
具体使用的角度理解:
数据的集合 + 合法操作的集合
int(单词integer的缩写),是C语言当中常用的整数类型。一般而言,int类型的变量占用4个字节的内存空间,加上C语言中的整数默认是有符号整数,它的取值范围是**[-2^31, 2^31 - 1]**
除此之外,int还规定了该变量可以做加减乘除等操作,但显然没有求长度,求重量这样的操作。
float(单精度浮点数),是C语言当中常用的浮点数类型。简单来说,它可以存储带小数位的数,比如0.1,123.6,-0.123等。浮点数通常遵循IEEE754标准,float占用4个字节的内存空间。同时,float类型的变量也可以执行加减乘除等操作,当然也没有求长度,求重量这样的操作。
局部变量:
- 他仅在声明他的{}内有效
- 在同一个{}内部,局部变量不能同名
- 局部变量没有初始化0值,他的赋值必须依赖程序员手动完成
变量声明:
告诉编译器的类型和名字,并且在程序的编译阶段,编译器会为该变量预分配内存空间
等到了程序运行,内存空间就会被分配
注:如果声明的是一个局部变量,局部变量仅有声明,那麽他不会有任何初始0值
如果使用一个仅声明的局部变量
此时该局部变量的值是随机的,未定义的,会产生未定义行为
未定义行为是危险的,任何c程序都要规避未定义行为
语法:int a;
变量的初始化:
初始化就是赋值,但是是第一次赋值,称为变量的初始化
变量的赋值:
除了第一次赋值以外的赋值就是变量的赋值
变量的定义:
- 变量的定义是声明一个变量,并且为之分配内存空间的组合动作。
- 变量的定义意味着,告诉编译器变量的类型和名称,而且在程序运行时要确定给此变量分配内存空间。
- 很多同学,会被"变量的定义"这个概念搞混淆,它和"变量的声明"有什么区别呢?
- 实际上,变量的定义一定是变量的声明。
- 但变量的声明不一定就是变量的定义。也就是说,某些特殊的变量声明,在程序运行时期不会为此变量分配内存空间。(这里我们先挖个坑,随后课程填坑挖个坑C++ 运算符重载 =赋值 ,=可能会调用函数
printf
如果希望指定保留p位小数位数,可以把**“.p”**放在%和f的中间。
主函数:
主函数的返回值是int 这是强制要求的;
c标准规定,当程序正常执行返回完毕后,主函数会返回0,返回给操作系统,表示程序正常执行
int main():
- 在C语言中,这种写法表示主函数不接受任何参数数据。
- 在C++中,它表示主函数可以接受任意数量和类型的参数(这是C++的独特之处)。
int main(void):
在C和C++中,都明确表示主函数不接受任何参数。
综上所述,我们给出以下结论和建议:
- 单纯的C语言代码中,二者没什么区别。
- 但考虑到C程序经常在C++编译器中编译运行,所以如果你的代码是纯粹的C语言,并且你明确知道 main 函数不应接收任何参数,应该使用 int main(void)。
- 这样做不仅符合C语言的标准,还能消除任何关于函数参数的歧义,特别是当你的代码在C++编译器中编译时。
- 在后续的课程中,一个C语言的函数,如果确定它不需要任何参数传入,请使用"(void)"!
关于main函数形参的补充:
操作系统在调用main函数时,是可以给main函数传参的,这就是命令行参数。当然若想要在调用main函数时,给main函数传参,main函数的形参就不能再使用void了。
这是后续课程一个非常重要的知识点,我们先挖个坑,后续课程再讲。