C语言程序设计善于利用指针.ppt





《C语言程序设计善于利用指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计善于利用指针.ppt(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第8 8章章 善于利用指针善于利用指针C C 语言程序设计语言程序设计北京航空航天大学北京航空航天大学 交通科学与工程学院交通科学与工程学院徐国艳徐国艳2/56指针指针的概念的概念指针和指针变量指针和指针变量指针指针与与数组数组指针做函数参数指针做函数参数8.1 8.1 8.2 8.2 8.38.38.4 8.4 章节章节内容内容3/56访问内存的两种方式:访问内存的两种方式:l l直接访问:按地址直接存取直接访问:按地址直接存取&a al l间接访问:通过指针间接访问:通过指针i间接存取间接存取8.18.1指针指针的概念的概念什么是指针?什么是指针?如何使用指针?如何使用指针?10001
2、0081004102310a bc3.551000i对于对于int a=10,c=5;int a=10,c=5;float b=3.5;float b=3.5;内存分配内存分配例例a的地址的地址a的内容的内容指针指针a的地址的地址a a是整型变量,存放内容是整型变量,存放内容i i是指针变量,存放地址是指针变量,存放地址a的地址a的指针指向指向a a4/56用指针i访问:用i+可以指向字符串中的每个地址!8.18.1指针指针的概念的概念1000ichar c=char c=“GOOD!GOOD!”;例例Gc0 OO内存分配内存分配D!0c1 c2 c5 1000100210011023为什么要
3、使用指针?为什么要使用指针?5/568.2 8.2 指针和指针变量指针和指针变量一、指针、指针变量与指向一、指针、指针变量与指向例:例:int a=10,*i,x;int a=10,*i,x;float b=3.5,float b=3.5,*p1*p1;char c,char c,*p2=&c*p2=&c;i=&a;p1=&b;i=&a;p1=&b;x=*i;x=*i;1010i i*i ia a10001000l l指针地址指针地址l l指针变量:指针变量:存放地址的变量存放地址的变量l l指针变量是一种新的数据类型指针变量是一种新的数据类型l l10001000是是a a 的指针的指针l
4、li i是指针变量是指针变量*i=ai=a二、指针变量的定义与赋值二、指针变量的定义与赋值数据类型数据类型*指针变量名指针变量名 10001000l l*i i是是i i指向的变量指向的变量a a指针运算指针运算*i i*i i定义指针变量定义指针变量指针初始化指针初始化指针赋值指针赋值6/56三、指针变量的赋值与操作三、指针变量的赋值与操作*-*-指针运算符指针运算符&-&-取地址运算符取地址运算符同级,右结合同级,右结合l l指针变量的赋值int a=3,*p,*p1,*p2,*p3,p4;int a=3,*p,*p1,*p2,*p3,p4;p=&a;p=&a;/*/*取取a a地址运算地
5、址运算*/p1=p;p1=p;/*/*直接赋值直接赋值*/p2=NULL;p2=NULL;/*/*赋空值,不指向任何变量赋空值,不指向任何变量*/*/p3=0;p3=0;l l指针变量的操作 int a=3,*p,*p1,k;int a=3,*p,*p1,k;p=&a;p=&a;/*a/*a地址地址P P*/*/k=*P;k=*P;/*3/*3k k*/*/*p=20;*p=20;/*20/*20a a*/*/*&a&a=30;=30;/*/*先取先取a a的地址,再按地址赋值的地址,再按地址赋值3 30 0a a*/*/p1=&*p;p1=&*p;/*/*因为因为&*&*p=&ap=&a,操
6、作结果使操作结果使p1p1指向指向a a*/*/7/56四、四、指针的引用指针的引用例例8.18.1:指针的赋值与输出指针的赋值与输出void main()void main()int a=10,b,c,*p;int a=10,b,c,*p;p=&a;b=*pp=&a;b=*p;c=a;c=a;printf(%d,%d,%dn,a,b,c);printf(%d,%d,%dn,a,b,c);printf(%d,%d,%dn printf(%d,%d,%dn,*p,p,&a,*p,p,&a););输出结果:输出结果:10,10,1010,10,1010,1739919326,17399193261
7、0,1739919326,1739919326printf(“%d,%dn,*&a,&*p);printf(“%d,%dn,*&a,&*p);第三行输出结果:第三行输出结果:10,173991932610,1739919326指针赋值指针赋值指针运算指针运算指针输出指针输出8/56方法方法方法方法1 1 1 1:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的指向求解。指向求解。指向求解。指向求解。void main()void main()void main()void main()int a,b,int a,b,
8、int a,b,int a,b,*p1p1p1p1,*p2p2p2p2,*p p p p;p1p1p1p1=&a;a;a;a;p2p2p2p2=&b;b;b;b;scanf(scanf(scanf(scanf(%d%d%d%d%d%d%d%d,p1p1p1p1,p2p2p2p2););););if(if(if(if(*p1p1p1p1 *p2p2p2p2)p p p p=p1p1p1p1;p1p1p1p1=p2p2p2p2;p2p2p2p2=p p p p;printf(printf(printf(printf(a=%d,b=%dna=%d,b=%dna=%d,b=%dna=%d,b=%dn,
9、a,b);,a,b);,a,b);,a,b);printf(printf(printf(printf(max=%d,min=%dnmax=%d,min=%dnmax=%d,min=%dnmax=%d,min=%dn,*p1p1p1p1,*p2p2p2p2););););a ab bp1p1p2p2p p6 68 8a=6,b=8a=6,b=8max=8,min=6max=8,min=68.2 指针和指针变量指针和指针变量【例【例8.2】输入输入a、b两个整数,两个整数,使用指针变量按大小顺序输出使用指针变量按大小顺序输出这两个整数。这两个整数。9/56方法方法方法方法2 2 2 2:利用指针变
10、量直接改变目标变量的值:利用指针变量直接改变目标变量的值:利用指针变量直接改变目标变量的值:利用指针变量直接改变目标变量的值求解。求解。求解。求解。void main()void main()void main()void main()int a,b,t,int a,b,t,int a,b,t,int a,b,t,*p1p1p1p1,*p2p2p2p2;p1p1p1p1=&a;a;a;a;p2p2p2p2=&b;b;b;b;scanf(scanf(scanf(scanf(%d%d%d%d%d%d%d%d,p1p1p1p1,p2p2p2p2););););if(if(if(if(*p1p1p1p
11、1 p1、p2=p1。指针与一个整型数据进行比较是没有意指针与一个整型数据进行比较是没有意义的义的。不同类型指针变量之间比较是非法的不同类型指针变量之间比较是非法的。NULL可以与任何类型指针进行可以与任何类型指针进行=、!=的关系运算,用于判断指针是否为空指针的关系运算,用于判断指针是否为空指针。404404404404404040408 8 8 841241241241241641641641642042042042012/56判断判断指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你对了吗?你对了吗?
12、应在类型相同应在类型相同的指针变量之的指针变量之间赋值间赋值13/56 数组名是该数组的指针数组名是该数组的指针数组名是该数组的指针数组名是该数组的指针 a a a a是是是是数组的首地址(即数组的首地址(即数组的首地址(即数组的首地址(即a0a0a0a0的地址),是一的地址),是一的地址),是一的地址),是一个指针常量。个指针常量。个指针常量。个指针常量。a=&a0,a+1=&a1,a=&a0,a+1=&a1,a=&a0,a+1=&a1,a=&a0,a+1=&a1,a+9=&a9,a+9=&a9,a+9=&a9,a+9=&a9 数组元素的下标表示法:数组元素的下标表示法:数组元素的下标表示法
13、:数组元素的下标表示法:a a a a 0 0 0 0 ,a,a,a,a 1 1 1 1 ,a,a,a,a i i i i ,a,a,a,a 9 9 9 9 数组元素的指针表示法:数组元素的指针表示法:数组元素的指针表示法:数组元素的指针表示法:*(a+0),(a+0),(a+0),(a+0),*(a+1),(a+1),(a+1),(a+1),*(a+i),(a+i),(a+i),(a+i),*(a+9)(a+9)(a+9)(a+9)8.3 指针与数组指针与数组8 8.3.1 3.1 指向数组的指针指向数组的指针指向数组的指针指向数组的指针1.1.一维数组的指针一维数组的指针一维数组的指针一维
14、数组的指针 例如:例如:例如:例如:int a10,*p;int a10,*p;int a10,*p;int a10,*p;a0a0a9a9p p p pa a14/56 当当当当p p p p指向指向指向指向a0a0a0a0时,用时,用时,用时,用p p p p表示数组元素表示数组元素表示数组元素表示数组元素 下标法:下标法:下标法:下标法:p0,p1,p0,p1,p0,p1,p0,p1,pi,pi,pi,pi,p9,p9,p9,p9 指针法:指针法:指针法:指针法:*(p+0),(p+0),(p+0),(p+0),*(p+1),(p+1),(p+1),(p+1),*(p+i),(p+i),
15、(p+i),(p+i),*(p+9)(p+9)(p+9)(p+9)a0a0a9a9p p p p8.3 指针与数组指针与数组8 8.3.1 3.1 指向数组的指针指向数组的指针指向数组的指针指向数组的指针1.1.一维数组的指针一维数组的指针一维数组的指针一维数组的指针 指向一维数组元素的指针变量指向一维数组元素的指针变量指向一维数组元素的指针变量指向一维数组元素的指针变量 由于数组元素也是一个内存变量,所以由于数组元素也是一个内存变量,所以由于数组元素也是一个内存变量,所以由于数组元素也是一个内存变量,所以此类指针变量的定义和使用与指向基本变量此类指针变量的定义和使用与指向基本变量此类指针变量
16、的定义和使用与指向基本变量此类指针变量的定义和使用与指向基本变量的指针变量相同。例如:的指针变量相同。例如:的指针变量相同。例如:的指针变量相同。例如:int a10,*p;int a10,*p;int a10,*p;int a10,*p;p=a;p=a;p=a;p=a;(或或或或 p=&a0;p=&a0;p=&a0;p=&a0;)a a15/56a a00a a99p p p pa a【例【例【例【例8 8.3.3.1.1】用指用指用指用指针输针输针输针输出数出数出数出数组组组组元素。元素。元素。元素。#include stdio.h#include stdio.hvoid main()vo
17、id main()int a10,i,*p;int a10,i,*p;for(i=0;i10;i+)for(i=0;i10;i+)scanf(%d,a+i);scanf(%d,a+i);for(i=0;i10;i+)for(i=0;i10;i+)printf(%4d,*(a+i);printf(%4d,*(a+i);printf(n);printf(n);for(p=a,i=0;i10;i+)for(p=a,i=0;i10;i+)printf(%4d,*(p+i);printf(%4d,*(p+i);printf(n);printf(n);8.3 指针与数组指针与数组8 8.3.1 3.1 指
18、向数组的指针指向数组的指针指向数组的指针指向数组的指针1.1.一维数组的指针一维数组的指针一维数组的指针一维数组的指针 12345678910 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 1016/56a a00a a99p p p pa a【例【例【例【例8 8.3.3.2.2】用指用指用指用指针针针针法法法法输输输输入入入入输输输输出数出数出数出数组组组组元素。元素。元素。元素。main()main()int a10,i,*p;int a10,i,*p;for(p=a;pa+10;p+)for(p=a;pa+10;p+)scanf(%d,p);scanf(
19、%d,p);for(p=a;pa+10;p+)for(p=a;pa+10;p+)printf(%d,*p);printf(%d,*p);printf(n);printf(n);8.3 指针与数组指针与数组8 8.3.1 3.1 指向数组的指针指向数组的指针指向数组的指针指向数组的指针1.1.一维数组的指针一维数组的指针一维数组的指针一维数组的指针 1017/56a0a0a9a9p p p pa1a1 .1 12 23 34 45 56 67 78 89 91010a a a a 数组名数组名数组名数组名是地址,指向数组的是地址,指向数组的是地址,指向数组的是地址,指向数组的指针变量指针变量指针
20、变量指针变量存放的也是地址。存放的也是地址。存放的也是地址。存放的也是地址。通过指针变量也可以引用数组元素。通过指针变量也可以引用数组元素。通过指针变量也可以引用数组元素。通过指针变量也可以引用数组元素。p p p p =&a0&a0&a0&a0 等效于等效于等效于等效于 p p p p =a a a a。数组名数组名数组名数组名和指向数组的和指向数组的和指向数组的和指向数组的指针变量指针变量指针变量指针变量的区别:的区别:的区别:的区别:指针变量指针变量指针变量指针变量p p p p是是是是变量变量变量变量可以赋值可以赋值可以赋值可以赋值,数组名数组名数组名数组名a a a a是地址是地址是
21、地址是地址常量常量常量常量不能赋值。不能赋值。不能赋值。不能赋值。8.3 指针与数组指针与数组8 8.3.1 3.1 指向数组的指针指向数组的指针指向数组的指针指向数组的指针用指针变量引用数组元素,用指针变量引用数组元素,用指针变量引用数组元素,用指针变量引用数组元素,必须关注其当前值。例如:必须关注其当前值。例如:必须关注其当前值。例如:必须关注其当前值。例如:p p p p=p p p p+3+3+3+3*(p-1)*(p-1)*(p-1)*(p-1)、p-1p-1p-1p-1等价于等价于等价于等价于a2a2a2a218/56 输入输入a数组数组 for(p=a;pa+4;p+)pp=p
22、for(q=p+1;q*q F pp=q T pp!=p F *pp*p 输出输出a数组数组选择法排序选择法排序N-S图图【例例例例8.8.4 4】输输输输入五个整数,使用指入五个整数,使用指入五个整数,使用指入五个整数,使用指针变针变针变针变量将量将量将量将这这这这五个五个五个五个数数数数 按从小到大排序后按从小到大排序后按从小到大排序后按从小到大排序后输输输输出。出。出。出。8.3 指针与数组指针与数组#include“stdio.h”#include“stdio.h”void main()void main()int a5,*pp,*p,*q,t;int a5,*pp,*p,*q,t;f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 善于 利用 指针

限制150内