复杂数据及运算-指针.ppt
《复杂数据及运算-指针.ppt》由会员分享,可在线阅读,更多相关《复杂数据及运算-指针.ppt(75页珍藏版)》请在三一办公上搜索。
1、第四章 复杂数据及运算,清华大学 郑 莉,数组复习问题,1)什么情况下使用数组?2)数组里的元素是顺序存放的吗?3)一维数组如何定义?4)一维数组的初始化5)一维数组元素怎么使用6)一维数组如何输入输出7)二维数组的使用,4.2指针,为了操作地址!,一点忠告!,C/C+可以直接操作内存地址。指针就是为了地址操作而存在的。指针是复杂又容易出错的。在不是必须使用指针的场合,不推荐用指针。我们学习指针不是为了到处用指针,而是在需要用的时候使用。我们自己写程序的时候,在确保程序实现功能的前提下,代码是越简单越好,而不是技巧越多,越复杂越好!,本节的学习,本节除了动态内存分配,其余所有程序例题,其实都可
2、以不需要指针。只所以用指针是为了帮助我们理解指针的用法。本节的学习,一定要了解一点内存的知识。内存单元的地址C+各种基本数据类型的长度(字节),4.2.1 数据在内存中的地址,内存空间的访问方式通过变量名访问通过地址访问,6,程序中:int i;,内存中每个字节有一个编号-地址,.,.,2001,2002,内存,0,i,编译或函数调用时为其分配内存单元,变量是对程序中数据存储空间的抽象,变量与地址,2000,如何获得变量的地址,地址运算取地址运算符:&数组的起始地址数组名字既是数组的起始地址,因此数组名是地址常量。,8,例4-5:观察变量在内存中的地址,#includeusing namesp
3、ace std;int main()int intVal=1;double dVal=2.0;int intarray3=0,1,2;cout,9,4.2 数组4.2.1数据在内存中的地址,运行结果:0013FF7C:10013FF74:20013FF68:0013FF68:0,例4-5(续),4.2 数组4.2.1数据在内存中的地址,对例4_5的分析:如何获得变量的地址,1,intVal,地址:&intVal,2,dVal,地址:&dVal,intArray,intArray是数组名,代表的是数组的起始地址,也就是第一个元素的地址。intArrayi,用下标法访问数组的元素。intArray
4、0是数组的第一个元素,该元素的地址是&intArray0。所以intArray,&intArray0,所存放的地址是一样的。,一旦定义了一个数组,数组名存放的就是数组的起始地址,也就是一个地址类型的数据。在生存期内,整个数组在内存中的所占用的存储空间是不变的,地址是不变的,所以数组名是一个地址类型的常量。,对一维数组的再探讨,一维数组有个关键问题:下标不可以越界。但是如果越界编译器并不能检查出错误。从地址的角度来考虑这个问题。,intArray,&intArray3,超出数组范围,可能对其他数据产生破坏,例4-6:观察一维数组在内存中的存储,#include#include using nam
5、espace std;const int size=5;int main()int arraysize;int i;for(i=0;isize;i+)arrayi=i;for(i=0;isize;i+)coutsetw(10)arrayi;coutendl;for(i=0;isize;i+)coutsetw(10),15,4.2 数组4.2.1数据在内存中的地址,运行结果:0 1 2 3 4 0012FF6C 0012FF70 0012FF74 0012FF78 0012FF7C&array5:0012FF80,例4-6(续),对例4_6的分析,通过本例的输出,可以看出数组元素是顺序存储的。在
6、编译时不会出现错误信息;运行后得到的错误信息,是操作系统发出的。,例4-7:观察多维数组在内存中的存储,#include#include using namespace std;const int nrow=3;const int ncol=2;int main()int arraynrowncol;int i;for(i=0;inrow;i+)for(int j=0;jncol;j+)arrayij=i+j;for(i=0;inrow;i+)for(int j=0;jncol;j+)coutsetw(3)arrayijsetw(10),18,4.2 数组4.2.1数据在内存中的地址,运行结果
7、:0 0012FF68 1 0012FF6C 1 0012FF70 2 0012FF74 2 0012FF78 3 0012FF7C,例4-7(续),4.2 数组4.2.1数据在内存中的地址,对例4_7的分析,通过本例的输出,可以看出多维数组元素是按行存储的。,二维数组在内存中的存储,占据一片连续存储区int a43,a00 a01 a02a10 a11 a12a20 a21 a22a30 a31 a32,按行存放,4.2.1 结束语,这个部分通过3个例子,展示了数据在内存中如何存放,特别强调了数组的存放。普通变量:用取地址运算符&获得地址。数组:数组名就是数组的起始地址。那么,地址取出来做什
8、么?刚学过的3个例子中,地址取出来只是做了输出。问题1:为什么要使用地址?问题2:如何使用地址?,问题1:为什么要使用地址?,在C+中,除了用变量名,还可以直接使用地址来访问内存单元。这样做的原因:1 有些场合更高效2 动态分配内存时必须用地址访问3 有效的表示复杂数据结构。,问题2:如何使用地址?,用于存放地址的变量就是指针类型的变量。,4.2.2 指针及指针运算,定义指针*Name;T为类型,表示指针所指对象的类型;*表示此变量类型为指/针;Name为定义指针的名称。指针变量赋初值1.在声明指针的同时进行初始化赋值;2.在声明之后,使用赋值表达式语句为指针赋值。,25,4.2 数组,程序中
9、:int i;,内存中每个字节有一个编号-地址,.,.,2001,2002,内存,0,i,编译或函数调用时为其分配内存单元,变量是对程序中数据存储空间的抽象,1 变量与地址,2000,.,.,2000,整型变量i,10,变量i_pointer,2004,指针:一个变量的地址。指针变量:专门用来存放地址的变量叫指针变量,它的值也可以是数组或函数的地址。,2000,指针,指针变量,变量的内容,变量的地址,2.指针与指针变量,.,1.指针变量与其所指向的变量之间的关系,注意:1、int*p1,*p2;与 int*p1,p2;不一样。2、指针变量名是p1,p2,不是*p1,*p2。3、指针变量只能指向
10、定义时所规定类型的变量。4、指针变量定义后,变量值不确定,应用前必须先赋值。,3.指针变量的定义,2.指针变量的定义一般形式:数据类型*指针名;,合法标识符,指针的目标变量的数据类型,表示定义指针变量不是乘法运算符*,例 int*p1,*p2;float*q;char*name;,含义:取变量的地址单目运算符结合性:自右向左,含义:从某个地址中获取数据单目运算符结合性:自右向左,两者关系:互为逆运算,4.取地址运算符&与指针运算符*,.,.,2000,2010,整型变量i,10,变量i_pointer,2004,2000,指针变量,i_pointer-指针变量,它的内容是地址量2000*i_p
11、ointer-指针的目标变量i,它的内容是数据10&i_pointer-指针变量占用内存的地址:2010,i_pointer&i&(*i_pointer)i*i_pointer*(&i),指针运算符示例,.,例 main()int i=10;int*p;*p=i;cout*p;,不可以危险!,例 main()int i=10,k;int*p;p=,5.指针变量必须先赋值,再使用!,空指针:定义:指针变量值为零 例如:int*p=0;,p指向地址为0的内存单元;系统保证该单元不作它用;表示指针变量的值没有意义。,P为空指针与未对p赋值不同避免指针变量的非法引用,6.空指针,例4-8:定义指针并通
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复杂 数据 运算 指针
链接地址:https://www.31ppt.com/p-6560362.html