c语言 善于利用指针.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《c语言 善于利用指针.ppt》由会员分享,可在线阅读,更多相关《c语言 善于利用指针.ppt(214页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、c语言善于利用指针8.1 指針是什么指針是什么如果在程序中定义了一个变量,在对程序进如果在程序中定义了一个变量,在对程序进行编译时,系统就会给行编译时,系统就会给该该变量分配内存单元变量分配内存单元编译系统根据程序中定义的变量类型,分配编译系统根据程序中定义的变量类型,分配一定长度的空间一定长度的空间例如,例如,VC+为整型变量分配为整型变量分配4个字节,对个字节,对单精度浮点型变量分配个字节,对字符型单精度浮点型变量分配个字节,对字符型变量分配个字节变量分配个字节inti=3,j=6,k;k=i+j;从这里取从这里取3将将9送到这里送到这里从这里取从这里取6直接存取直接存取inti=3,j=
2、6,k;定义特殊变量定义特殊变量i_pointer将将i的地址的地址存到这里存到这里间接存取间接存取i_pointer=&i;*i_pointer=50;5050i200032000i_pointer*i_pointer20003直接存取直接存取间接存取间接存取为了表示将数值送到变量中,可以有两为了表示将数值送到变量中,可以有两种表达方法:种表达方法:(1)将将3直接送到变量直接送到变量i所标识的单元中,例所标识的单元中,例如:如:i=3;(2)将将3送到变量送到变量i_pointer所指向的单元所指向的单元(即变量(即变量i的存储单元),例如:的存储单元),例如:*i_pointer=3;其
3、中其中*i_pointer表示表示i_pointer指向的对象指向的对象指向就是通过地址来体现的指向就是通过地址来体现的u假设假设i_pointer中的值是变量的地址中的值是变量的地址(2000),这样就在,这样就在i_pointer和变量之间和变量之间建立起一种联系,即通过建立起一种联系,即通过i_pointer能知道能知道i的地址,从而找到变量的地址,从而找到变量i的内存单元的内存单元由于通过地址能找到所需的变量单元,因由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元此说,地址指向该变量单元将地址形象化地称为将地址形象化地称为“指针指针”。意思是通过。意思是通过它能找到以它为地
4、址的内存单元它能找到以它为地址的内存单元一个变量的一个变量的地址地址称为该变量的称为该变量的“指针指针”例如,地址例如,地址2000是变量的指针是变量的指针如果有一个变量专门用来存放另一变量的如果有一个变量专门用来存放另一变量的地址(即指针),则它称为地址(即指针),则它称为“指针变量指针变量”i_pointer就是一个指针变量。指针变量就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针)針变量的值是地址(即指针)“指针指针”和和“指针变量指针变量”是是不同的不同的概念概念可以说变量可以说变量i的指针是的指针是2000,而
5、不能说,而不能说i的的指针变量是指针变量是2000指针是一个地址,而指针变量是存放地址指针是一个地址,而指针变量是存放地址的变量的变量8.2 指针变量指针变量8.2.1使用指针变量的例子使用指针变量的例子8.2.2怎样定义指针变量怎样定义指针变量8.2.3怎样引用指针变量怎样引用指针变量8.2.4指针变量作为函数参数指针变量作为函数参数8.2.1使用指针变量的例子使用指针变量的例子例例8.1通通过指针变量访问整型变量。过指针变量访问整型变量。解题思路:先定义解题思路:先定义2个整型变量,再定个整型变量,再定义义2个指针变量,分别指向这两个整型个指针变量,分别指向这两个整型变量,通过访问指针变量
6、,可以找到它变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的们所指向的变量,从而得到这些变量的值。值。#includeintmain()inta=100,b=10;int*pointer_1,*pointer_2;pointer_1=&a;pointer_2=&b;printf(“a=%d,b=%dn”,a,b);printf(“*pointer_1=%d,*pointer_2=%dn”,*pointer_1,*pointer_2);return0;定义两个指针变量定义两个指针变量使使pointer_1指向指向a使使pointer_2指向指向b直接直接输出变量输出变量a和和
7、b的值的值间接间接输出变量输出变量a和和b的值的值#includeintmain()inta=100,b=10;int*pointer_1,*pointer_2;pointer_1=&a;pointer_2=&b;printf(“a=%d,b=%dn”,a,b);printf(“*pointer_1=%d,*pointer_2=%dn”,*pointer_1,*pointer_2);return0;此处此处*与与类型名类型名在一起。在一起。此时共同定义指针变量此时共同定义指针变量此处此处*与指针变量一起使用。此与指针变量一起使用。此时时代表指针变量所指向的变量代表指针变量所指向的变量8.2.2
8、 怎样定义指针变量怎样定义指针变量定义指针变量的一般形式为:定义指针变量的一般形式为:类型类型*指针变量名指针变量名;如:如:int*pointer_1,*pointer_2;uint是是为为指针变量指定的指针变量指定的“基类型基类型”u基类型指定指针变量可指向的变量类型基类型指定指针变量可指向的变量类型u如如pointer_1可以指向整型变量,但不能指可以指向整型变量,但不能指向浮点型变量向浮点型变量8.2.2 怎样定义指针变量怎样定义指针变量下面都是合法的定义下面都是合法的定义和初始化和初始化:float*pointer_3;char*pointer_4;inta,b;int*pointe
9、r_1=&a,*pointer_2=&b;*pointer_1&a;错误错误pointer_3&a;错误错误pointer_1&a;正确正确pointer_32000;错误错误8.2.3 怎样引用指针变量怎样引用指针变量在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:u给指针变量赋值。如:给指针变量赋值。如:p=&a;u引用指针变量指向的变量引用指针变量指向的变量。如如有有p=&a;*p=1;则执行则执行printf(“%d”,*p);将输出将输出1u引用指针变量的值。如:引用指针变量的值。如:printf(“%o”,p);使使p指向指向a*p相当于相当于a以以八八进制输进
10、制输出出a的地址的地址8.2.3 怎样引用指针变量怎样引用指针变量要熟练掌握两个有关的运算符:要熟练掌握两个有关的运算符:(1)取地址运算符。取地址运算符。&a是变量是变量a的地址的地址(2)*指针运算符(指针运算符(“间接访问间接访问”运算符)运算符)如果如果:p指向变量指向变量a,则则*p就代表就代表a。k=*p;(把把a的值的值赋给赋给k)*p=1;(把把1赋给赋给a)例例8.2输入输入a和和b两个整数,按先大后小的两个整数,按先大后小的顺序输出顺序输出a和和b。解题思路:用指针方法来处理这个问题。解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指针不交换整型变量的值
11、,而是交换两个指针变量的值。变量的值。#includeintmain()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b成立成立#includeintmain()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&
12、b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b&b&a#includeintmain()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b&b&a#includeint
13、main()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b&b&a可否改为可否改为p1=&b;p2=&a;?注意注意:ua和和b的值并未交换,它们仍保持原值的值并未交换,它们仍保持原值u但但p1和和p2的值改变了。的值改变了。p1的值原为的值原为&a,后,后来变成来变成&b,p2原值为原值为&b,后来变成,
14、后来变成&au这样在输出这样在输出*p1和和*p2时,实际上是输出变时,实际上是输出变量量b和和a的值,所以先输出的值,所以先输出9,然后输出,然后输出58.2.4 指针变量作为函数参数指针变量作为函数参数例例8.3题目要求同例题目要求同例8.2,即对输入的两个,即对输入的两个整数按大小顺序输出。现用函数处理,而且整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。用指针类型的数据作函数参数。解题思路:定义一个函数解题思路:定义一个函数swap,将指向两,将指向两个整型变量的指针变量作为实参传递给个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过函数的形参
15、指针变量,在函数中通过指针实现交换两个变量的值。指针实现交换两个变量的值。#includeintmain()voidswap(int*p1,int*p2);inta,b;int*pointer_1,*pointer_2;printf(pleaseenteraandb:);scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“max=%d,min=%dn”,a,b);return0;abpointer_159&a&bpointer_2voidswap(int*p1,int*p2
16、)inttemp;temp=*p1;*p1=*p2;*p2=temp;abpointer_159&a&bpointer_2p1&ap2&b95voidswap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;voidswap(int*p1,int*p2)int*temp;*temp=*p1;*p1=*p2;*p2=*temp;错!错!无确定的指向无确定的指向#includeintmain()if(ab)swap(a,b);printf(“max=%d,min=%dn”,a,b);return0;voidswap(intx,inty)inttemp
17、;temp=x;x=y;y=temp;错!错!无法交换无法交换a,bab59xy5995如果想通过函数调用得到个要改变的值如果想通过函数调用得到个要改变的值:在主调函数中设个变量,用个指针变量指在主调函数中设个变量,用个指针变量指向它们向它们设计一个函数,有设计一个函数,有n个指针形参。在这个函数个指针形参。在这个函数中改变这个形参的值中改变这个形参的值在主调函数中调用这个函数,在调用时将这在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的地址传给该函数个指针变量作实参,将它们的地址传给该函数的形参的形参在执行该函数的过程中,通过形参指针变量,在执行该函数的过程中,通过形参指针
18、变量,改变它们所指向的个变量的值改变它们所指向的个变量的值主调函数中就可以使用这些改变了值的变量主调函数中就可以使用这些改变了值的变量例例8.4对输入的两个整数按大小顺序输出。对输入的两个整数按大小顺序输出。解题思路:尝试调用解题思路:尝试调用swap函数来实现题函数来实现题目要求。在函数中改变形参目要求。在函数中改变形参(指针变量指针变量)的的值,希望能由此改变实参值,希望能由此改变实参(指针变量指针变量)的值的值#includeintmain()voidswap(int*p1,int*p2);inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b
19、);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(max=%d,min=%dn,a,b);return0;voidswap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;错!错!只交换形参指向只交换形参指向注意:函数的调用可以(而且只可以)得注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。如果不用指针变量是难以做到这一点
20、的。要善于利用指针法。要善于利用指针法。例例8.5输入输入3个整数个整数a,b,c,要求按由大,要求按由大到小的顺序将它们输出。用函数实现。到小的顺序将它们输出。用函数实现。解题思路:采用例解题思路:采用例8.3的方法在函数中改的方法在函数中改变这变这3个变量的值。用个变量的值。用swap函数交换两函数交换两个变量的值,用个变量的值,用exchange函数改变这函数改变这3个变量的值。个变量的值。#includeintmain()voidexchange(int*q1,int*q2,int*q3);inta,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,&a,&b,&c);p1
21、=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(“%d,%d,%dn,a,b,c);return0;调用结束后不会调用结束后不会改变指针的指向改变指针的指向voidexchange(int*q1,int*q2,int*q3)voidswap(int*pt1,int*pt2);if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);voidswap(int*pt1,int*pt2)inttemp;temp=*pt1;*pt1=*pt2;*pt2=temp;交换指针指交换指针指向的变量值
22、向的变量值8.3通过指针引用数组通过指针引用数组8.3.1数组元素的指针数组元素的指针8.3.2在引用数组元素时指针的运算在引用数组元素时指针的运算8.3.3通过指针引用数组元素通过指针引用数组元素8.3.4用数组名作函数参数用数组名作函数参数8.3.5通过指针引用多维数组通过指针引用多维数组8.3.1 数组元素的指针数组元素的指针一个变量有地址,一个数组包含若干元素,一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址每个数组元素都有相应的地址指针变量可以指向数组元素(把某一元素指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)的地址放到一个指针变量中)所谓数组元素的
23、指针就是数组元素的地址所谓数组元素的指针就是数组元素的地址可以用一个指针变量指向一个数组元素可以用一个指针变量指向一个数组元素inta10=1,3,5,7,9,11,13,15,17,19;int*p;p=&a0;等价于等价于p=a;等价于等价于int*p=a;或或int*p=&a0;注意注意:数组名数组名a不代表整个数组,不代表整个数组,只代表数组首元素的地址。只代表数组首元素的地址。“p=a;”的作用是的作用是“把把a数组的首数组的首元素的地址赋给指针变量元素的地址赋给指针变量p”,而不,而不是是“把数组把数组a各元素的值赋给各元素的值赋给p”。8.3.2 在引用数组元素时指针的运算在引用
24、数组元素时指针的运算在指针指向数组元素时,在指针指向数组元素时,允许允许以下运算:以下运算:u加一个整数加一个整数(用用+或或+=),如,如p+1u减一个整数减一个整数(用用-或或-=),如,如p-1u自加运算,如自加运算,如p+,+pu自减运算,如自减运算,如p-,-pu两个指针相减,如两个指针相减,如p1-p2(只有只有p1和和p2都都指向同一数组中的元素时才有意义指向同一数组中的元素时才有意义)(1)如果指针变量如果指针变量p已指向数组中的一个元已指向数组中的一个元素,则素,则p+1指向同一数组中的下一个元素,指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。指向同一数组中的
25、上一个元素。floata10,*p=a;假设假设a0的地址为的地址为2000,则,则up的值为的值为2000up+1的值为的值为2004uP-1的值为的值为1996越界越界(2)如果的初如果的初值为值为&a0,则则p+i和和a+i就就是数组元素是数组元素ai的地址,的地址,或者说,它们或者说,它们指向指向a数组序号数组序号为为i的元素的元素a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9(3)*(p+i)或或*(a+i)是是p+i或或a+i所指向的所指向的数组元素,即数组元素,即ai。a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言 善于利用指针 语言 善于 利用 指针
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内