内存
程序在硬盘上以文件的形式存在,但他们的运行却是在计算机的内存里发生的。
整形,浮点型 4 个字节,字符 1个 字节。
浮点型是从字节8处开始存储。
对齐
问题:浮点型变量C的值为什么从内存地址8处开始存储,而不是从内存地址5处存储。
其实在c++里,变量类型是根据他们的自然边界进行对齐,不过这个我们只需要知道即可,不需要太关心,因为编译器会帮我们处理这类的问题。
对齐问题会因为系统平台不同而不同。
寻址
- 变量名索引
- 另一种通过地址
这里引出一个新的操作符,取址操作符 & 这个叫 and。作用是获取变量的地址。
用法
1 | int var = 123; |
32位对应 4位字节,64位对应8位字节。
地址
地址在程序执行期间不会发生变化。
不过同一个程序不同时间加载到内存中,同一个变量的地址是会改变的。
使用指针
- 地址是计算机内存中的某个位置,指针是专门用来存放地址的特殊类型变量
- 一般用这种形式
type *pointerName;
来声明指针变量 int *p;
int pp = 123;
p = &pp;
思考
int *p1,p2,p3;
这里只表示 将p1申请为指针,p2,p3是整形
空格
空格放在哪里都是可以接受的。
1 | int *p1; |
指针变量前的类型,必须配对使用;
为什么要指针变量
- 直接访问硬件
- 快速访问数据
- 返回一个以上的值(返回数组或者结构体的指针)
- 表示复杂的数据结构
- 方便处理字符串
总结
- 创建变量时,系统将分配一些内存块用来保存它们的值;
- 每个内存块拥有一个独一无二的地址;
- 变量的地址可以用 &variablename 语法来取得;(注:& 我们称为 ”取地址” 操作符)
- 可以把地址赋值给一种称为指针的特殊变量;
- 指针的类型必须与由它保存其地址的变量的类型一致。
利用指针改变值
1 | int a = 456; |
这会让程序保留4个内存块,两个为变量保留,两个为指针保留。变量a 和变量b 里边存放的是变量的值; 两个指针变量存放着指针的值,这些值是其他变量的地址
图解
指针只需要存放地址的第一个数就行,因为知道变量类型,变量类型有固定的字节个数,所以知道地址的第一个数,向后推就可以得到全部的地址。
1 | #include <iostream> |
*号的作用
- 第一种用于创建指针
int *myPointer = &myInt;
- 第二种是对指针进行解引用
*myPointer = 3998;
- 乘号
指针群p
C++ 允许指针群 P,就是多个指针有同样的值1
2int *p1 = &myInt;
int *p2 = &myInt;
C++ 支持无类型(void)指针,就是没有被声明为某种特定类型的指针
1 | void *vPointer |
对一个无类型指针进行解引用前,必须先把它转换为一种适当的数据类型.