谭浩强版C程序设计第6章指针.ppt
《谭浩强版C程序设计第6章指针.ppt》由会员分享,可在线阅读,更多相关《谭浩强版C程序设计第6章指针.ppt(60页珍藏版)》请在三一办公上搜索。
1、第6章 指针,本章要点 指针的概念 数组与指针 字符串与指针 函数与指针 指针数组和指向指针的指针 引用,6.1 指针的概念,1.内存地址 计算机的内存储器被划分成一个个的存储单元,这些存储单元按一定的规则编号,这个编号就是存储单元的地址。每个存储单元的大小为一个字节,每个单元有一个唯一的地址。,2000,0000,2.变量的地址 在程序中定义的所有变量,都要分配相应的存储单元,不同类型的数据所需要的存储空间的大小不同。系统分配给变量的内存空间的起始单元地址称为该变量的地址。如:int I,K;I=3;K=5;,0000,2000,2004,I,K,3,5,3.内存单元的访问方式,在程序中一般
2、通过变量名访问(存取)内存单元.这种按变量地址存取变量值的方式称为直接存取方式,或直接访问方式.间接存取(间接访问)方式是指将变量I的地址存放在另一个变量J中,通过变量J访问变量I的值.,2000,4.指针与指针变量,指针:一个变量的地址也称为该变量的指针。指针变量:用于存储其它变量的指针(即地址)的变量。指针变量的定义:数据类型*指针变量名;如:int*p1;float*p2;char*p3;,6.2.指针变量的使用,1.指针变量的赋值通常把被指向的变量的地址赋给指针变量 如:int*p1,a=3;p1=&:取地址运算符 注意:不能用一个整数给一个指针变量赋值.一个指针变量只能指向同一个类型
3、的变量.,2000,3,p1,a,2000,6.2.指针变量的使用,2.指针变量的引用 间接访问指针变量所指向的存储单元.指针运算符(*)如:int*p1,a=3;p1=,例 通过指针变量存取变量的值,#include void main()int a,*p1;double b,*p2;char c,*p3;p1=,程序运行结果为:1011.2A,例6.2 输入a和b两个数,按从小到大的顺序输出,#include void main()int a,b;int*p1,*p2,*p;cout a b;p1=,程序运行结果为:请输入两个整数:30 10min=10 max=30,3.指针作为函数的参
4、数,指针作为函数的参数,传递的是变量的地址,可以实现地址传递。例6.3 指针作为函数参数,被调函数中交换参数值,#include void swap(int*x,int*y);void main()int a,b;a=10;b=20;swap(,void swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;,程序运行过程中变量值的变化分析,(a),(b),(c),(d),程序运行结果为:20,10,比较数值型参数,#include void swap(int x,int y);void main()int a,b;a=10;b=20;swap(a,b
5、);cout a,b endl;,10,20,x,y,10,temp,20,20,x,y,10,temp,20,10,x,y,10,temp,void swap(int x,int y)int temp;temp=x;x=y;y=temp;,注意:值传递时,函数的实参与形参在内存中占用不同的存储空间,值只能由实参传递给形参,而形参的变化并不会影响实参。,比较以下函数,#include void swap(int*x,int*y);void main()int a,b;a=10;b=20;swap(,void swap(int*x,int*y)int*temp;temp=x;x=y;y=temp
6、;,void swap(int*x,int*y)int*temp;*temp=*x;*x=*y;*y=*temp;,#,1.指针运算指针运算包括算术运算、关系运算与赋值运算。指针可以与整数进行加减运算,结果与指针所指向的数据类型有关。p+n表示指针p当前所指向位置后面第n个同类型数据的地址,p-n表示指针p当前所指向位置前面第n个同类型数据的地址。,6.3 指针与数组,例 指针与整数的加减运算,#include void main()int a,*p1,*p2;double b,*p3,*p4;p1=,程序运行结果为:0 x0012FF7C 0 x0012FF6C0 x0012FF80 0 x
7、0012FF740 x0012FF78 0 x0012FF640 x0012FF90 0 x0012FF94,指向同一种数据类型的指针可以进行关系运算。两个相同类型的指针相等,表示这两个指针指向同一个地址。指针也可以与0进行比较运算,如果p=0成立,我们称p是一个空指针,即指针p还没有具体指向。为了避免使用没有指向的指针,在定义指针变量时,可以将其初始化为0(也可以写成NULL)。,指针的关系运算,例:使用空指针,#include void main()int a,*p=NULL;cout p endl;if(p!=NULL)*p=10;cout 将10赋值给p所指向的地址 endl;else
8、cout p是空指针,不能使用!endl;p=,程序运行结果为:0 x00000000p是空指针,不能使用!0 x0012FF7C将10赋值给p所指向的地址,数组在内存中是连续存放的,每个数组元素都占用存储单元,有相应地址,所以指针可以指向数组元素.如:int a10,*p;p=*p,a5 含义相同,2.指向数组元素的指针,数组名就是数组的首地址(第一个元素的地址),指针可以与整数进行加减运算,利用这一性质可以方便地通过指针引用数组元素。如:int a10,*p;则:p=a;p=含义相同 p+i a+i 含义相同*(p+i)*(a+i)ai 含义相同注:又称变址运算符.ai 的地址为:a+i*
9、d 指向数组元素的指针变量也可带下标,如pi.,2.指向数组元素的指针,例 使用指针输出数组中的所有元素,#include void main()int a6=1,2,3,4,5,6;int*p;p=a;for(int i=0;i6;i+)cout*p;p+;cout endl;,程序运行结果为:1 2 3 4 5 6,例6.5 输出数组中的全部元素。,下标法#include using namespace std;int main()int a10;int i;for(i=0;iai;coutendl;for(i=0;i10;i+)coutai;coutendl;return 0;,用指针变
10、量指向数组元素#include using namespace std;int main()int a10;int i,*p=a;for(i=0;i*(p+i);/输入a0a9coutendl;for(p=a;p(a+10);p+)cout*p;coutendl;return 0;,比较,下标法每次通过变址运算符计算数组元素的地址,指针变量直接指向元素,不必每次都重新计算地址,故效率高.但是,用下标法比较直观,能直接知道第几个元素.,注意,指针变量可能指向数组以后的内存单元,在使用指针变量指向数组元素时,应切实保证指向数组中有效的元素.注意指针变量自加自减运算及其所指向的元素.p+使p指向下一
11、个元素*p+先得到p所指变量值,再使p加1.等同于*(p+).*(+p)先使p加1,再得到p所指变量值.(*p)+表示p所指向的元素值加1.,例:指向同一个数组的两个指针的减法运算,#include void main()int a10=1,2,3,4,5,6,7,8,9,10;int*p1,*p2;p1=a;p2=,程序运行结果为:3 5,3.指针作为函数的参数接收数组地址,数组名作为函数的参数实际上传递的是数组的首地址,进行的是地址传递,用指针变量作函数参数,同样可以接收实参传来的数组首元素的地址。例6.6 用选择法将10个整数按由小到大的顺序排列。要求:将形参改为指针变量。,函数,voi
12、d select_sort(int*p,int n)/用指针变量作形参 int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(*(p+j)*(p+k)k=j;/用指针法访问数组 t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;,#include using namespace std;void select_sort(int*p,int n);int main()int a10,i;coutai;coutendl;select_sort(a,10);coutthe sorted array:endl;for(i=0;i10;i+)
13、coutai;coutendl;return 0;,主程序,说明,用指针变量作形参,接收实参数组名,和数组名作形参,本质上是一样的.C+编译系统将形参数组名一律作为指针变量处理.如:void select_sort(int array,int n)处理为:void select_sort(int*array,int n)在函数调用时不存在占有内存空间的形参数组,只为指针变量分配空间,形参数组和实参数组共占同一段内存单元.,实参和形参的结合有4种形式,注:实参数组名是常量,形参数组名是变量,例:编写一个函数,将数组中的元素按照相反的顺序存放,分析:将数组名和元素个数作为函数的参数,可以通过地址访
14、问数组中的所有元素。在函数中将数组的第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,一直进行到中间,即完成反序存放。,源程序,#include void inv(int x,int n);void main()int i,a10=0,1,2,3,4,5,6,7,8,9;cout 原数组:endl;for(i=0;i10;i+)cout ai;cout endl;inv(a,10);cout 交换后的数组:endl;for(i=0;i10;i+)cout ai;cout endl;,程序运行结果为:原数组:0 1 2 3 4 5 6 7 8 9交换后的数组:9 8 7 6 5 4
15、3 2 1 0,void inv(int x,int n)int temp,i,j,m;m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;,注意:由于传递的是数组地址,因此形参x和实参a指向相同的内存地址,因此在函数体中对x的操作实际上就是对a的操作,注意:数组名作为函数参数传递的是数组首地址,因此也可以直接将形参改为指针,当数组名作为实参时,同样能够传递数组首地址。将函数inv()做以下修改:,void inv(int*x,int n)int*i,*j,temp,m;m=(n-1)/2;for(i=x,j=x+n-1;ij;i+,j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 谭浩强版 程序设计 指针
链接地址:https://www.31ppt.com/p-5397512.html