1 程序在存储数据时的策略
为把信息存储在计算机中,程序必须记录3个基本属性:
- 信息将存储在哪里;
- 要存储什么值;
- 存储何种类型的信息。
1.1 简单变量
int jumbo = 12;
声明语句指出了值的类型和变量名,还让程序为值分配内存,并在内部跟踪该内存单元。
int jumbo = 12;
&jumbo = 00CAFED0;//& 取地址
//信息将存储在00CAFED0;
//要存储12;
//存储int类型的信息.
注意:
-
变量名
可以将变量名理解为一个指向存储空间的地址,但C++对变量名不做存储,变量名的作用只是用于编译器生成汇编代码;仅当在调试版本时,会单独存储在一段空间,供调试工具读取。 -
变量值
根据变量类型,存储在堆区或栈区。 -
变量地址
除非保存为指针,否则不会存储变量的地址。
1.2 指针(一级指针)
int *pe1 = &jumbo;
声明语句指出了指针的类型和指针名,* 指针名,可以得到该地址处存储的值。
int *pe1 = &jumbo;
pe1 = 00CAFED0;//等价&jumbo
*pe1 = 12;//等价jumbo
注意:
-
指针名
指针名表示的是地址。 -
*指针名
指针名,指出定义的是一个指针变量;也可以这样理解int是一个复合类型,是指向int型的指针。 -
*运算符
*运算符被称为间接值或解除引用运算符,将其引用于指针,可以得到该地址处存储的值。
1.3 二级指针
int **pe2 = &pe1;
首先任何值都有地址,一级指针的值虽然是地址,但这个地址做为一个值也需要空间来存放,是空间就具有地址;二级指针就是为了获取存放一级指针地址值的地址。
&pe1 = 00CAFEC4;//&取一级指针的地址
pe2 = 00CAFEC4;//等价&pe1
*pe2 = 00CAFED0;//等价pe1等、价&jumbo
**pe2 = 23;//等价*pe1、等价jumbo
-
指针的用途
提供目标的读取或改写。 -
一级指针
关联的是其值(一个地址)名下空间里的数据,这个数据可以是任意类型并做任意用途。 -
二级指针
关联的数据只有一个类型一个用途,就是地址;
二级指针是为了提供对于内存地址的读取或者改写。
1.4 测试代码
#include <iostream>
using namespace std;
int main()
{
int jumbo = 23;
int *pe1 = &jumbo;
int **pe2 = &pe1;
cout << "jumbo:" << jumbo << endl;
cout << "*pe1:" << *pe1 << endl;
cout << "**pe2:" << **pe2 << endl;
cout << "--------------------------" << endl;
cout << "&jumbo:" << &jumbo << endl;
cout << "pe1:" << pe1 << endl;
cout << "*pe2:" << *pe2 << endl;
cout << "&pe1:" << &pe1 << endl;
cout << "pe2:" << pe2 << endl;
}
//结果
jumbo:23
*pe1:23
**pe2:23
--------------------------
&jumbo:00CAFED0
pe1:00CAFED0
*pe2:00CAFED0
&pe1:00CAFEC4
pe2:00CAFEC4