指针详解
7.1 指针的概述
7.1.1 内存
内存含义:
l 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分。
l 内存:内部存贮器,暂存程序/数据——掉电丢失 SRAM、DRAM、DDR、DDR2、DDR3。
l 外存:外部存储器,长时间保存程序/数据—掉电不丢ROM、ERRROM、FLASH(NAND、NOR)、硬盘、光盘。
内存是沟通CPU与硬盘的桥梁:
l 暂存放CPU中的运算数据
l 暂存与硬盘等外部存储器交换的数据
7.1.2 物理存储器和存储地址空间
有关内存的两个概念:物理存储器和存储地址空间。 物理存储器:实际存在的具体存储器芯片。
l 主板上装插的内存条
l 显示卡上的显示RAM芯片
l 各种适配卡上的RAM芯片和ROM芯片
存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义。
l 编码:对每个物理存储单元(一个字节)分配一个号码
l 寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写
7.1.3 内存地址
l 将内存抽象成一个很大的一维字符数组。(因为每个空间占一字节,这和字符相同)
l 编码就是对内存的每一个字节分配一个32位或64位的编号(与32位或者64位处理器相关)。
l 这个内存编号我们称之为内存地址。
内存中的每一个数据都会分配相应的地址:
l char:占一个字节分配一个地址
l int: 占四个字节分配四个地址 l float、struct、函数、数组等
7.1.4 指针和指针变量
l 内存区的每一个字节都有一个编号,这就是“地址”。
l 如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号)
l 指针的实质就是内存“地址”。指针就是地址,地址就是指针。
l 指针是内存单元的编号,指针变量是存放地址的变量。
l 通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。
7.2 指针的基本概念
指针的作用: 可以通过指针间接访问内存 注意:
1. 内存编号是从0开始记录的,一般用十六进制数字表示
2. 可以利用指针变量保存地址
7.3 指针变量的定义和使用
指针变量定义语法: 数据类型 * 变量名;
举例:
#include <iostream>
using namespace std;
int main070301()
{
int a = 10; //定义整型变量a
int* p = NULL; //定义一个指针
//int*代表一种数据类型,int*是指针类型,p是变量名
//指针变量赋值
p = &a;
cout << p << endl;
cout << &a << endl;
//指针的使用
//通过*操作指针变量指向的内存
cout << "*p = " << *p << endl; //解引用,*叫做取值运算
*p = 20;
cout << a << endl;
return EXIT_SUCCESS;
}
注意:
&可以取得一个变量在内存中的地址。但是,不能取寄存器变量,因为寄存器变量不在内存里,而在CPU里面,所以 是没有地址的。
示例2:通过指针间接修改变量的值
int main()
{
int a = 0;
int b = 11;
int* p = &a; *p = 100;
cout << "a= " << a << ", *p= " << *p << endl;