《善于利用指针》PPT课件.ppt
《《善于利用指针》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《善于利用指针》PPT课件.ppt(213页珍藏版)》请在三一办公上搜索。
1、第8章 善于利用指针,8.1 指针是什么8.2 指针变量8.3 通过指针引用数组8.4 通过指针引用字符串8.5 指向函数的指针8.6 返回指针值的函数8.7 指针数组和多重指针8.8 动态内存分配与指向它的指针变量8.9 有关指针的小结,8.1 指針是什么,如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元编译系统根据程序中定义的变量类型,分配一定长度的空间例如,VC+为整型变量分配4个字节,对单精度浮点型变量分配个字节,对字符型变量分配个字节,8.1 指针是什么,内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标识的内存单元中存放数据
2、,这相当于旅馆房间中居住的旅客一样。由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。将地址形象化地称为“指针”,务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别例如:,int i=3,j=6,k;,printf(“%d”,i);,通过变量名i,找到i的地址2000,从而从存储单元读取3,int i=3,j=6,k;,k=i+j;,从这里取3,将9送到这里,从这里取6,直接存取,int i=3,j=6,k;,定义特殊变量i_pointer,将i的地址存到这里,间接存取,i_pointer=,*i_pointer=50;,50,i,2000,3,2000,i_pointe
3、r,*i_pointer,2000,3,直接存取,间接存取,为了表示将数值送到变量中,可以有两种表达方法:(1)将3直接送到变量i所标识的单元中,例如:i=3;(2)将3送到变量i_pointer所指向的单元(即变量i的存储单元),例如:*i_pointer=3;其中*i_pointer表示i_pointer指向的对象,指向就是通过地址来体现的假设i_pointer中的值是变量的地址(2000),这样就在i_pointer和变量之间建立起一种联系,即通过i_pointer能知道i的地址,从而找到变量i的内存单元,由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元将地址形象化地称为“指
4、针”。意思是通过它能找到以它为地址的内存单元,一个变量的地址称为该变量的“指针”例如,地址2000是变量的指针如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”i_pointer就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针),“指针”和“指针变量”是不同的概念可以说变量i的指针是2000,而不能说i的指针变量是2000指针是一个地址,而指针变量是存放地址的变量,8.2 指针变量,使用指针变量的例子8.2.2 怎样定义指针变量8.2.3 怎样引用指针变量8.2.4 指针变量作为函数参数,使用指针变量的例子,例8.1 通过指针变量访问
5、整型变量。解题思路:先定义2个整型变量,再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的值。,#include int main()int a=100,b=10;int*pointer_1,*pointer_2;pointer_1=,定义两个指针变量,使pointer_1指向a,使pointer_2指向b,直接输出变量a和b的值,间接输出变量a和b的值,#include int main()int a=100,b=10;int*pointer_1,*pointer_2;pointer_1=,此处*与类型名在一起。此时共同定义指针变量,此
6、处*与指针变量一起使用。此时代表指针变量所指向的变量,8.2.2 怎样定义指针变量,定义指针变量的一般形式为:类型*指针变量名;如:int*pointer_1,*pointer_2;int是为指针变量指定的“基类型”基类型指定指针变量可指向的变量类型如pointer_1可以指向整型变量,但不能指向浮点型变量,8.2.2 怎样定义指针变量,下面都是合法的定义和初始化:float*pointer_3;char*pointer_4;int a,b;int*pointer_1=,*pointer_1 错误,pointer_3 错误,pointer_1 正确,pointer_32000;错误,8.2.3
7、 怎样引用指针变量,在引用指针变量时,可能有三种情况:给指针变量赋值。如:p=,使p指向a,*p相当于a,以八进制输出a的地址,8.2.3 怎样引用指针变量,要熟练掌握两个有关的运算符:(1)取地址运算符。(把1赋给a),例8.2 输入a和b两个整数,按先大后小的顺序输出a和b。解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指针变量的值。,#include int main()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2,p,5,9,&a,&b,成立,#include int mai
8、n()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2,p,5,9,&a,&b,&b,&a,#include int main()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2,p,5,9,&a,&b,&b,&a,#include int main()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2,p,5,9,&a,&b,&b,&a,可
9、否改为p1=?,注意:a和b的值并未交换,它们仍保持原值但p1和p2的值改变了。p1的值原为&a,后来变成&b,p2原值为&b,后来变成&a这样在输出*p1和*p2时,实际上是输出变量b和a的值,所以先输出9,然后输出5,8.2.4 指针变量作为函数参数,例8.3 题目要求同例8.2,即对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。解题思路:定义一个函数swap,将指向两个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。,#include int main()void swap(int*p1,int*p2);in
10、t a,b;int*pointer_1,*pointer_2;printf(please enter a and b:);scanf(“%d,%d”,a,b,pointer_1,5,9,&a,&b,pointer_2,void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;,a,b,pointer_1,5,9,&a,&b,pointer_2,p1,&a,p2,&b,9,5,void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;,void swap(int*p1,int*
11、p2)int*temp;*temp=*p1;*p1=*p2;*p2=*temp;,错!无确定的指向,#include int main()if(ab)swap(a,b);printf(“max=%d,min=%dn”,a,b);return 0;void swap(int x,int y)int temp;temp=x;x=y;y=temp;,错!无法交换a,b,a,b,5,9,x,y,5,9,9,5,如果想通过函数调用得到个要改变的值:在主调函数中设个变量,用个指针变量指向它们 设计一个函数,有n个指针形参。在这个函数中改变这个形参的值 在主调函数中调用这个函数,在调用时将这n个指针变量作实
12、参,将它们的地址传给该函数的形参 在执行该函数的过程中,通过形参指针变量,改变它们所指向的个变量的值主调函数中就可以使用这些改变了值的变量,例8.4 对输入的两个整数按大小顺序输出。解题思路:尝试调用swap函数来实现题目要求。在函数中改变形参(指针变量)的值,希望能由此改变实参(指针变量)的值,#include int main()void swap(int*p1,int*p2);int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,void swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,错!只交换形参指向,注意:函数
13、的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。要善于利用指针法。,例8.5 输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。解题思路:采用例8.3的方法在函数中改变这3个变量的值。用swap函数交换两个变量的值,用exchange函数改变这3个变量的值。,#include int main()void exchange(int*q1,int*q2,int*q3);int a,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,调用结束后不会改变指针的指向,void exchan
14、ge(int*q1,int*q2,int*q3)void swap(int*pt1,int*pt2);if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);void swap(int*pt1,int*pt2)int temp;temp=*pt1;*pt1=*pt2;*pt2=temp;,交换指针指向的变量值,8.3通过指针引用数组,8.3.1 数组元素的指针8.3.2 在引用数组元素时指针的运算8.3.3 通过指针引用数组元素8.3.4 用数组名作函数参数8.3.5 通过指针引用多维数组,8.3.1 数组元素的指针,
15、一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)所谓数组元素的指针就是数组元素的地址,可以用一个指针变量指向一个数组元素 int a10=1,3,5,7,9,11,13,15,17,19;int*p;p=,等价于p=a;,等价于int*p=a;或int*p=,注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。,8.3.2 在引用数组元素时指针的运算,在指针指向数组元素时,允许以下运算:加一个整数(用+或+=),如p+
16、1减一个整数(用-或-=),如p-1自加运算,如p+,+p自减运算,如p-,-p两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义),(1)如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。float a10,*p=a;假设a0的地址为2000,则p的值为2000p+1的值为2004P-1的值为1996,越界,(2)如果的初值为&a0,则p+i和a+i就是数组元素ai的地址,或者说,它们指向a数组序号为i的元素,p,p+1,a+1,p+i,a+i,p+9,a+9,(3)*(p+i)或*(a+i)是p+i或a+i所
17、指向的数组元素,即ai。,p,p+1,a+1,p+i,a+i,p+9,a+9,*(p+i),(4)如果指针p1和p2都指向同一数组 p2-p1的值是4 不能p1+p2,p1,p2,8.3.3 通过指针引用数组元素,引用一个数组元素,可用下面两种方法:()下标法,如ai形式()指针法,如*(a+i)或*(p+i)其中a是数组名,p是指向数组元素的指针变量,其初值p=a,8.3.3 通过指针引用数组元素,例8.6 有一个整型数组a,有10个元素,要求输出数组中的全部元素。解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3)用指针变量指向数组
18、元素分别写出程序,以资比较分析。,(1)下标法。#include int main()int a10;int i;printf(“enter 10 integer numbers:n);for(i=0;i10;i+)scanf(%d,(2)通过数组名计算数组元素地址,找出元素的值#include int main()int a10;int i;printf(“enter 10 integer numbers:n);for(i=0;i10;i+)scanf(%d,scanf(%d,a+i);,(3)用指针变量指向数组元素#include int main()int a10;int*p,i;pri
19、ntf(“enter 10 integer numbers:n);for(i=0;i10;i+)scanf(%d,for(p=a;p(a+10);p+)scanf(%d,p);,for(p=a;p(a+10);a+)printf(“%d”,*a);错!,3种方法的比较:第(1)和第(2)种方法执行效率相同编译系统是将ai转换为*(a+i)处理的,即先计算元素地址。因此用第(1)和第(2)种方法找数组元素费时较多。,3种方法的比较:第(3)种方法比第(1)、第(2)种方法快用指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作是比较快的这种有规律地改变地址值(p+)能大大提高执行效
20、率,3种方法的比较:用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。,例8.7 通过指针变量输出整型数组a的10个元素。解题思路:用指针变量p指向数组元素,通过改变指针变量的值,使p先后指向a0到a9各元素。,#include int main()int*p,i,a10;p=a;printf(“enter 10 integer numbers:n);for(i=0;i10;i+)scanf(“%d”,p+);for(i=0;i10;i+,p+)printf(“%d”,*p);printf(n);return 0;,退出循环时p指
21、向a9后面的存储单元,因此执行此循环出问题,重新执行p=a;,8.3.4 用数组名作函数参数,用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量C编译都是将形参数组名作为指针变量来处理的,int main()void fun(int arr,int n;int array10;fun(array,10);return 0;void fun(int arr,int n),fun(int*arr,int n),int main()void fun(int arr,int n;int array10;fun(array,10);return 0;void fun(in
22、t*arr,int n),array0,arr0,array数组,arr,array3,arr3,arr+3,实参数组名是指针常量,但形参数组名是按指针变量处理在函数调用进行虚实结合后,它的值就是实参数组首元素的地址在函数执行期间,形参数组可以再被赋值void fun(arr,int n)printf(%dn,*arr);arr=arr+3;printf(%dn,*arr);,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组
23、a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,#include int main()void inv(int x,int n);int i,a10=3,7,9,11,0,6,7,5,4,2;for(i=0;i10;i+)printf(“%d”,ai);printf(n);inv(a,10);for(i=0;i10;i+)printf(“%d”,ai);p
24、rintf(n);return 0;,void inv(int x,int n)int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;,void inv(int x,int n)int temp,*i,*j;i=x;j=x+n-1;for(;ij;i+,j-)temp=*i;*i=*j;*j=temp;,优化,例8.9 改写例8.8,用指针变量作实参。,#include int main()void inv(int*x,int n);int i,arr10,*p=arr;for(i=0;i10;i+,p+)sca
25、nf(“%d”,p);inv(p,10);for(p=arr;parr+10;p+)printf(“%d”,*p);printf(n);return 0;,不可少!,例8.10 用指针方法对10个整数按由大到小顺序排序。解题思路:在主函数中定义数组a存放10个整数,定义int*型指针变量p指向a0定义函数sort使数组a中的元素按由大到小的顺序排列在主函数中调用sort函数,用指针p作实参用选择法进行排序,#include int main()void sort(int x,int n);int i,*p,a10;p=a;for(i=0;i10;i+)scanf(“%d”,p+);p=a;so
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 善于利用指针 善于 利用 指针 PPT 课件
链接地址:https://www.31ppt.com/p-5483003.html