资源预览内容
第1页 / 共95页
第2页 / 共95页
第3页 / 共95页
第4页 / 共95页
第5页 / 共95页
第6页 / 共95页
第7页 / 共95页
第8页 / 共95页
第9页 / 共95页
第10页 / 共95页
亲,该文档总共95页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第六章 指针和引用,第六章 指针,6.1 指针的概念 6.2 指针与数组 6.3 指针和函数 6.4 动态存储分配 6.5 引用,6.1 指针的概念,为什么要引入指针的概念? 指针可以有效地表示复杂数据结构,如队列、栈、链表等。 指针能象汇编语言一样处理内存地址,为动态内存分配提供支持。 指针可实现对数组和字符串的方便使用,提高某些子程序的效率。,6.1 指针的概念,关于指针的原则 学习原则 一定要学会 其实通常的应用很简单 使用原则 永远要清楚每个指针指向了哪里,2019/5/23,4/82,2019/5/23,5/82,main() int a=5; int b; float x=3.5; ,变量的两个物理意义,6.1.1 指针和指针变量,变量的内容,变量的内容,变量的内容,变量的地址,变量的地址,变量的地址,变量的地址和变量的内容,变量的地址 变量所分配存储空间的首地址 变量的内容 变量在所分配的存储空间中存放的数据,2019/5/23,6/82,2019/5/23,7/82,main() int a,b; float x=35; a=5; b=a+3; ,1001 1002 1003 1004 1015 1016 1017 1018,a b,利用变量名存取数据的方式称为“直接存取”方式。,直接存取和间接存取,8,2019/5/23,8/82,C 语言还提供了对内存单元的“间接存取”方式,5,1001,3,main( ) int a=5,b=3,*p; p = ,变量的地址称为变量的指针 存放地址的变量称为指针变量 p指向c,c为p所指向的目标变量。,直接存取和间接存取,8,2019/5/23,9/58,int main() float x, *p1=NULL; float *p2= ,2000,6.1.2 指针变量的定义,NULL,指针变量初始化,数据类型 * 指针变量名,2012,2020,6.1.2 指针变量的定义,说明: 当把一个变量的地址作为初值赋给指针时,该变量必须先给以定义,且该变量的数据类型必须与指针的数据类型一致 也可把一个已初始化的指针值作为初值赋予另一指针 也可通过初始化定义某种类型的空指针,2019/5/23,10/82,2019/5/23,11/82,6.1.3 指针的基本运算,取地址运算,间接存取运算* *指针变量或目标变量的地址 int i, *p; p = ,pa指针变量 *pa指针pa的目标变量 &pa指针变量pa占用存 储区域地址,2019/5/23,12/82,2004,6.1.3 指针的基本运算,2000,*p = ,5,6.1.3 指针的基本运算,赋值运算 把一个变量的地址赋给一个同类型的指针,如: int a, *pa; pa=&a; /* 使pa指向变量a */ 把一个指针的值赋给另一同类型的指针,如: char c, *s1=&c, *s2; s2=s1; /* 结果s1和s2指向同一变量c */,2019/5/23,13/82,6.1.3 指针的基本运算,赋值运算 将地址常量如数组名赋给同类型的指针,如: char *str,ch80; str=ch; /* 使str得到字符数组ch的首地址,即str指向数组ch */ 同类型指针算术运算的结果,如果还是地址量的话,可以赋值给同类型的指针。例如: int *p1,*p2,a20; p1=a; p2=p1+5; p1=p2-3;,2019/5/23,14/82,2019/5/23,15/82,方法1:目标变量值不变,改变指针变量的 指向求解。 #include using namespace std; int main() int a, b, *p1, *p2, *p; p1= ,【例6.1】输入a、b两个整数, 使用指针变量按大小顺序输出 这两个整数。,6 8 a=6,b=8 max=8,min=6,6.1.3 指针的基本运算,2019/5/23,16/82,方法2:利用指针变量直接改变目标变量的值。 #include using namespace std; int main() int a, b, t, *p1, *p2; p1= ,6 8 a=8,b=6 max=8,min=6,6,6.1.3 指针的基本运算,int main() int a10=10,20,30,40,50,60,70,80,90,100; int i, *ptr, *p1, *p2; ptr=a; for (i=0;i10;i+) (*ptr)+; ptr+; p1=p2=a;p1+=5; p2+; cout“a=”aendl; cout“p1=”p1”,*p1=”*p1endl; cout“p2=”p2”, *p2=”*p2endl; cout“p1-p2=”p1-p2endl; cout“*(p1+2)=”*(p1+2) “,(*p1)+2=”(*p1+2)endl; return 0; ,2019/5/23,17/82,指针的算术运算,6.1.3 指针的基本运算,指针加减运算要点: 两个指针变量不能做加法运算。 只有当指针变量指向数组时,并且只有当运算结果仍指向同一数组中的元素时,指针的加减运算才有意义。 指针加减运算的结果不以字节为单位,而是以数据类型的大小(即sizeof(类型))为单位。 只有当两个指针变量指向同一数组时,进行指针相减才有实际意义。 *(p1+n)与(*p1)+n是两个不同的概念。,ptr,31,21,11,41,51,61,71,81,91,101,2019/5/23,18/82,指针的关系运算, 指向同一数组的两个指针可以进行关系运算 指针与一个整型数据比较是没有意义的,不同类型指针变量之间的比较是非法的。 NULL可以与任何类型指针进行=、!=的运算,用于判断指针是否为空指针。,6.1.3 指针的基本运算,6.1.4 指针作为函数参数,2019/5/23,19/82,【例6.3】从键盘任意输入两个整数,编程将其交换后再重新输出。,2019/5/23,20/82,void swap(int *p1,int *p2 ) int temp; cout“调用中交换前:*p1=“*p1 “,*p2=“*p2endl; temp=*p1; *p1=*p2; *p2=temp; cout“调用中交换后:*p1=“*p1 “,*p2=“*p2endl; ,int main( ) int x1,x2; cinx1x2; cout“1: x1=“x1 “,x2=“x2endl; swap( ,void swap(int x,int y) int temp; cout“调用中交换前: x=” x“,y=”yendl; temp=x; x=y; y=temp; cout调用中交换后:x=“ x“,y=“yendl; ,方法 1,方法 2,int main( ) int x1,x2; cinx1x2; cout“1: x1=“x1 “,x2=“x2endl; swap(x1,x2); cout“2:x1=“x1“,x2=“ x2endl; return 0; ,例6-3 编写函数实现两数的互换,Not Work!Why?,20 10 1: x1=20,x2=10 调用中交换前:x=20,y=10 调用中交换后:x=10,y=20 2: x1=20,x2=10,20 10 1: x1=20,x2=10 调用中交换前:*p1=20,*p2=10 调用中交换后:*p1=10,*p2=20 2: x1=10,x2=20,2019/5/23,21/82,主调函数,被调函数,int main( ) int x1,x2; cinx1x2; cout“1: x1=“x1 “,x2=“x2endl; swap(x1,x2); cout“2:x1=“x1 “,x2=“x2endl; return 0; ,void swap(int x,int y) int temp; cout“调用中交换前:x=“ x“,y=“yendl; temp=x; x=y; y=temp; cout“调用中交换后:x=“ x“,y=“yendl; ,20,20,x1,x2,实 参,形 参,10,10,方法 1,x,y,2019/5/23,22/82,主调函数,被调函数,int main( ) int x1,x2; cinx1x2; cout“1: x1=“x1 “,x2=“x2endl; swap( ,void swap(int *p1,int *p2 ) int temp; cout“调用中交换前:*p1=“ *p1“,*p2=“*p2endl; temp=*p1; *p1=*p2; *p2=temp; cout“调用中交换后:*p1=“ *p1“,*p2=“*p2endl; ,&x1,&x1,实 参,形 参,&x2,&x2,方法 2,p1,p2,20,x1,x2,10,2019/5/23,23/82,void swap(int *p1,int *p2) int *p; cout“调用中交换前:*p1=“*p1“,*p2=“*p2endl; p=p1; p1=p2; p2=p; cout“调用中交换后:*p1=“*p1“,*p2=“*p2endl; ,int main( ) int x1,x2; cinx1x2; cout“1: x1=”x1“,x2=”x2endl; swap( ,方法 3,例6-3 编写函数实现两数的互换,10 1: x1=20,x2=10 调用中交换前:*p1=20,*p2=10 调用中交换后:*p1=10,*p2=20 2: x1=20,x2=10,Not Work too!Why?,2019/5/23,24/82,主调函数,被调函数,int main( ) int x1,x2; cinx1x2; cout“1: x1=“x1 “,x2=“x2endl; swap( ,void swap(int *p1,int *p2) int *p; cout“调用中交换前:*p1=“ *p1“,*p2=”*p2endl; p=p1; p1=p2; p2=p; cout“调用中交换后:*p1=“ *p1“,*p2=“*p2endl; ,&x1,&x1,实 参,形 参,&x2,&x2,方法3,p1,p2,20,x1,x2,10,&x1,p,2019/5/23,25/82,数组名是该数组的指针 a&a0,a+1&a1, ,a+4&a4 数组元素的下标表示法: a0,a1, ,ai, ,a4 数组元素的指针表示法: *(a+0),*(a+1), ,*(a+i), ,*(a+4),6.2 指针与数组,6.2.1 指针与一维数组,1. 建立指针与一维数组的联系,例如: int a5;,a0,a4,a,2019/5/23,26/82,用p表示数组元素 下标法: p0,p1, ,p9 指针法: *(p+0),*(p+1), ,*(p+9),2. 通过指针引用数组元素,例如:int a10,*p; p = a;(或 p = ),a,6.2.1 指针与一维数组,2019/5/23,27/82,【例6.4】用指针变量引用数组元素,完成给数组元素赋值并输出数组元素。 #include using namespace std; int main( ) int *p,b5,i; p=b; /*
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号