图 上泽充通大¥ C+程序设计与实践 第5讲指针与引用 上海交通大学 机械与动力工程学院 2014.9-2015.1 上海京通大学 1.指针概念 2.数组与指针 3. 字符串与指针 4.const:指针类型 5.引用 6.动态内存分配 1 1
1 1/48 第5讲 指针与引用 C++程序设计与实践 上海交通大学 机械与动力工程学院 2014.9-2015.1 2/48 1. 指针概念 2. 数组与指针 3. 字符串与指针 4. const指针类型 5. 引用 6. 动态内存分配
储存单元的地址 1. 计算机的内存被划分成一个个存储单元,每个存 储单元的大小为一个字节。每个存储单元都有唯 一的编号,这个编号就是存储单元地址。 2.计算机就是通过这种地址编号的方式管理内存数 据读写的准确性。 3.当一个变量被声明,系统就会根据这个变量的类 型为这个变量在内存分配一个存储空间,大小由 变量类型决定。 地址 数据 址 数据 器 国上海文大修 变量在内存空间中的实现 int a=1,b=2; 内存地址 内存空间 口系统为变量a,b分配内存空间 0x0019F898 0x01 变量名a是指从0x19F898 到0x19F89B,大小为4 0x0019F899 0x00 变量a 个字节的一段内存,变量 0x0019F89A 0x00 值1就放在这段内存中。 >变量名b是指从0x19F8A4 0x0019F89B 0x00 到0x19F8A7,大小为4 个字节的一段内存,变量 值2就放在这段内存中。 0x0019F8A4 0x02 0x0019F8A5 0x00 变量b 0x0019F8A6 0x00 0x0019F8A7 0x00 国上泽1大学 2
2 3 储存单元的地址 1. 计算机的内存被划分成一个个存储单元,每个存 储单元的大小为一个字节。每个存储单元都有唯 一的编号,这个编号就是存储单元地址。 2. 计算机就是通过这种地址编号的方式管理内存数 据读写的准确性。 3. 当一个变量被声明,系统就会根据这个变量的类 型为这个变量在内存分配一个存储空间,大小由 变量类型决定。 地址 地 址 译 码 器 数据 数据 4 变量在内存空间中的实现 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 变量a 变量b 0x0019F898 0x0019F899 0x0019F89A 0x0019F89B 0x0019F8A4 0x0019F8A5 0x0019F8A6 0x0019F8A7 int a=1,b=2; 内存地址 内存空间 系统为变量a,b分配内存空间 变量名a是指从0x19F898 到0x19F89B ,大小为4 个字节的一段内存,变量 值1就放在这段内存中。 变量名b是指从0x19F8A4 到0x19F8A7 ,大小为4 个字节的一段内存,变量 值2就放在这段内存中。 … …
符号表一变量名和地址之间的桥梁 口变量名是一个标志符(identifier),是用来标识内存中一 段区域,便于人们阅读; 口地址是CPU对内存单元进行读写的依据; 口编译器在对程序编译时产生了一个符号表,使变量名和地 址产生了一一对应; 口在可执行的.exe程序中,没有变量名,只有对变量所对应 的地址的操作。 地址 变量名 编译符号表 (intel 变量名地址 大小(字节)类型 0x0019F8984 int oe2 6 0x0019F8A44 int 周上海文大学 5 如何获取变量的地址? 口C++中提供了取地址运算符& >int a; >a的地址为&a; #include <iostream> using namespace std; C:\Windows\system... int main() a=1b=2 a= 8019F8A4 &h=0019F898 int a=1,b=2; 清按任意键继续。·· cout<<"a="<<a<<\t<<"b="< <b<<endl; cout<<"&a="<<&a<<t'<<"& b"<<&b<<endl; return 0; 国上泽1大学 6 3
3 5 符号表—变量名和地址之间的桥梁 编译符号表 变量名 地址 大小(字节) 类型 a 0x0019F898 4 int b 0x0019F8A4 4 int 变量名是一个标志符(identifier) ,是用来标识内存中一 段区域,便于人们阅读; 地址是CPU对内存单元进行读写的依据; 编译器在对程序编译时产生了一个符号表,使变量名和地 址产生了一一对应; 在可执行的.exe程序中,没有变量名,只有对变量所对应 的地址的操作。 地址 变量名 6 如何获取变量的地址? C++中提供了取地址运算符& int a; a的地址为&a; #include <iostream> using namespace std; int main() { int a=1,b=2; cout<<"a="<<a<<'\t'<<"b="< <b<<endl; cout<<"&a="<<&a<<'\t'<<"& b"<<&b<<endl; return 0; }
地址在生活中的应用:房号、房间、旅客 C++HOTEL 201 202 203 204 101 102 103 104 1)旅客住在不同的房间中; 2)每个房间都有房号; 3)」 房间有不同的类型:单人房,双人房 国上海文大等 7 地址在生活中的应用:在酒店中找人 寻找Tom 假设Tom在201房 是否知道Tom 是 的房号 否 找人的两种方式: 1. 直接导找: 通过前台了解Tom的房号 知道房号 2.间接寻找: 先找前台,从前台得到房号 在201房找到Tom 国上泽通大学 8 4
4 7 地址在生活中的应用:房号、房间、旅客 C + + HOTEL 1) 旅客住在不同的房间中; 2)每个房间都有房号; 3)房间有不同的类型:单人房,双人房 201 202 203 204 101 102 103 104 8 地址在生活中的应用:在酒店中找人 寻找Tom 是否知道Tom 的房号 在201房找到Tom 假设Tom在201房 通过前台了解Tom的房号 是 否 找人的两种方式: 1. 直接寻找: 知道房号 2. 间接寻找: 先找前台,从前台得到房号
二者对比 储存空间 空间地址 空间中内容储存单元类型 房间 房号 客人 客房类型(单人、双人间) 内存单元指针(地址) 变量值 变量类型(int,char,double,float) 怎样在内存中找变量值呢? 国上海文大等 9 访问变量的两种方式 直接访问: 按变量地址存取变量的值。ci>>i;实际上放到定义1单元的地 址中。 2000 ©间接访问: ·将变量地址放在另一单元i_pointer,通过i_pointer取出变量 的地址,再针对变量操作。 i pointer 2000 2000 ·一个变量的地址称为该变量的指针。1是变量,2000是的在内存 中的地址,是i的指针。2000本身存放在i_pointer中 国上海大学 10 5
5 9 二者对比 储存空间 空间地址 空间中内容 储存单元类型 房间 房号 客 人 客房类型(单人、双人间) 内存单元 指针(地址) 变量值 变量类型(int, char, double, float) 10 访问变量的两种方式 直接访问: • 按变量地址存取变量的值。cin>>i; 实际上放到定义 i 单元的地 址中。 间接访问: • 将变量地址放在另一单元i_pointer,通过 i_pointer 取出变量 的地址,再针对变量操作。 • • 一个变量的地址称为该变量的指针。i是变量,2000是i的在内存 中的地址,是i的指针。2000本身存放在i_pointer中 i 2000 2000 2000 i 3 i_pointer