c语言 第9章_指针及其应用(1)课后复习重点[1]_第1页
c语言 第9章_指针及其应用(1)课后复习重点[1]_第2页
c语言 第9章_指针及其应用(1)课后复习重点[1]_第3页
c语言 第9章_指针及其应用(1)课后复习重点[1]_第4页
c语言 第9章_指针及其应用(1)课后复习重点[1]_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022-5-612022-5-62为什么引入指针的概念为什么引入指针的概念2022-5-63寻址方式寻址方式 0 内存用户数据区内存用户数据区 2000 3 变量变量 i 2004 6 变量变量 j 2008 9 变量变量 k 3010 2000 变量变量 i_pointer 2022-5-64关于指针的原则关于指针的原则2022-5-65指针的概念指针的概念 a:(3000) b:(4000)8字节字节4字节字节2022-5-66指针变量指针变量 p(4000) c(2000)75 2000*p2022-5-67指针变量的声明指针变量的声明例如例如: int i; int *p1; flo

2、at f1; float *p2; 2022-5-68指针变量的赋值指针变量的赋值赋给指针变量,不是赋给目标变量赋给指针变量,不是赋给目标变量例例: int i; int *p=&i;变量必须变量必须已说明过已说明过类型类型应一致应一致例例: int *p=&i; int i;( )例例: int i; int *p; p=&i; 2022-5-69例例: int i; int *p=&i; int *q=p;用已初始化指针变量作初值用已初始化指针变量作初值例例: int *p; p=1000; ()指针变量的赋值指针变量的赋值2022-5-610例例: voi

3、d main( ) int i=10; int *p; *p=i; printf(%d,*p); 危险!危险!例例: void main( ) int i=10,k; int *p; p=&k; *p=i; printf(%d,*p); 指针变量必须指针变量必须先赋值,再使用先赋值,再使用.200020042008整型变量整型变量i 指针变量指针变量p10随机随机2012变量变量k2004102022-5-611int i;float *p;p=&i;一个指针变量不能指向一个指针变量不能指向与其类型不同的变量与其类型不同的变量!int *p;float *q;p=q;应在类型相

4、同的指应在类型相同的指针变量之间赋值针变量之间赋值int *p;p=100;指针变量只存放地址指针变量只存放地址!我是真的,我是真的,你猜对了吗?你猜对了吗?2022-5-612取内容运算取内容运算*操作符操作符例如:例如: char c,*p=&c; *p=a; 这里这里*p 等同于变量等同于变量c 例如:例如: float f, *pf=&f; *pf =5.6f; *pf = *pf +4.4f;*pf表示表示变量变量f2022-5-613含义含义:取变量的地址取变量的地址单目运算符单目运算符优先级优先级: 2结合性结合性:自右向左自右向左含义含义:取指针所指向变量的内容

5、取指针所指向变量的内容单目运算符单目运算符优先级优先级: 2结合性结合性:自右向左自右向左&与与*操作符操作符2022-5-614.200020082012整型变量整型变量i变量变量i_pointer20042000指针变量指针变量10i_pointer &i &(*i_pointer)i *i_pointer *(&i)=i_pointer -指针变量,它的内容是地址量指针变量,它的内容是地址量*i_pointer-指针的指针的目标变量目标变量,它的内容是数据,它的内容是数据&i_pointer-指针变量占用内存的地址指针变量占用内存的地址200010

6、i_pointer*i_pointer&i_pointeri指针变量指针变量变量变量变量地址变量地址(指针指针)变量值变量值地址存入地址存入指针变量指针变量指向指向2022-5-615.200020082012整型变量整型变量i变量变量i_pointer20042000指针变量指针变量10例例 i=3;-直接访问直接访问3例例 *i_pointer=20; -间接访问间接访问20直接访问与间接访问直接访问与间接访问2022-5-616例例:指针的概念指针的概念int main() int a,*pa=&a; a=10; printf(a:%dn,a); printf(*pa:%

7、dn,*pa); printf(&a:%x(hex)n,&a); printf(pa:%x(hex)n,pa); printf(&pa:%x(hex)n,&pa); return 0;.f86f8af8e整型变量整型变量a 指针变量指针变量pa10f86运行结果:运行结果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f8a(hex)2022-5-617例例:输入两个数,并使其从大到小输出输入两个数,并使其从大到小输出int main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&a

8、mp;b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2); return 0;.2000201620042008201220242020指针变量指针变量p1 指针变量指针变量p 指针变量指针变量p2 整型变量整型变量b 整型变量整型变量a59输入输入5,9(回车)(回车)a=5,b=9max=9,min=5201220162012201620122022-5-618指针与其它类型变量的对比指针与其它类型变量的对比2022-5-619指

9、针与函数指针与函数2022-5-620按值传递按值传递2022-5-621.2000201620042008201220242020例例:交换两个数交换两个数形参形参和和实参实参都为都为一般变量一般变量#include void swap(int x,int y) int t; t=x; x=y; y=t;int main() int a=7,b=11; printf(a=%d,b=%dn,a,b); printf(swapped:n); swap(a,b); printf(a=%d,tb=%dn,a,b); return 0;a x bt y7117117117调用前调用前调用中调用中调用结

10、束调用结束值传递值传递int a=7,b=11;int *pointer_1=&a,*pointer_2=&b;swap(*pointer_1,*pointer_2);2022-5-622按地址传递按地址传递2022-5-623.2000201620042008201220242020void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;int main() int a=7,b=11; printf(a=%d,b=%dn,a,b); printf(swapped:n); swap(&a,&b); pri

11、ntf(a=%d,b=%dn,a,b); return 0;例例:交换两个数交换两个数形参形参为为指针变量指针变量a p1 bp p2711200020047117调用前调用前调用中调用中调用结束调用结束地址传递地址传递 int *p; p=p1; p1=p2; p2=p;/仅仅改变指针的指向,没有交换仅仅改变指针的指向,没有交换a,b值值2022-5-624.2000201620042008201220242020void swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p;int main() int a=7,b=11; int *pointe

12、r_1=&a,*pointer_2=&b; printf(a=%d,b=%dn,a,b); printf(swapped:n); swap(pointer_1,pointer_2); printf(a=%d,b=%dn, *pointer_1,*pointer_2); return 0;a pointer_1 bp1 pointer_27112000200420042000调用前调用前调用中调用中调用结束调用结束p2p200020042000例例:交换两个数交换两个数形参形参和和实参实参都为都为指针变量指针变量2022-5-625void swap(int *p1, int *

13、p2) int *p; *p=*p1; *p1=*p2; *p2=*p;int main() int a=7,b=11; int *pointer_1=&a,*pointer_2=&b; printf(a=%d,b=%dn,a,b); printf(swapped:n); swap(pointer_1,pointer_2); printf(a=%d,b=%dn, *pointer_1,*pointer_2); return 0;例例:交换两个数交换两个数形参形参和和实参实参都为都为指针变量指针变量int x,*p=&x;指针变量在使用前指针变量在使用前必须赋值!必须赋值

14、!2022-5-6262022-5-627日期转换问题日期转换问题 2022-5-628计算某年的第几天是该年的第几月第几日计算某年的第几天是该年的第几月第几日2022-5-629例:例:int array10; int *p=&array1; array0array1array2array3array9.p指针与数组指针与数组2022-5-630指针运算指针运算-算术运算算术运算2022-5-631+(*p)*(+p)*(p+)(*p)+让让p指向的指向的对象对象+1先让先让p指向下一个单元指向下一个单元,再取,再取p指向的对象指向的对象先取先取p指向的对象,再让指向的对象,再让p指

15、向下一单元指向下一单元先取先取p指向的对象,再让指向的对象,再让对象对象+1指针运算指针运算-算术运算算术运算n例如例如: int a=1,b=3,*p; p=&a; +(*p); *(+p); p22022-5-632指针运算指针运算-关系运算关系运算2022-5-633指针运算指针运算-赋值运算赋值运算void main() int a,*p=&a; scanf(%d,p);2022-5-634指针与数组指针与数组6000600160026003600460056006600760086009a0a1a2aa+1a+2pp+1p+2数组名数组名是表示数组是表示数组首地首地址

16、的址的地址常量地址常量2022-5-635a0a1a2a3a9.aa+9a+1a+2地址地址元素元素下标法下标法a0a1a2a9 变址运算符变址运算符ai *(a+i)*a*(a+1)*(a+2)*(a+9)a0a1a2a3a9.pp+9p+1p+2地址地址指针法指针法元素元素*p*(p+1)*(p+2)*(p+9)p0p1p2p9ai pi *(p+i) *(a+i)数组元素表示方法数组元素表示方法2022-5-636输入输出数组的全部元素输入输出数组的全部元素方法方法1:下标法下标法 void main() int a10; int i; for (i=0; i10; i+) scanf(

17、%d, &ai); for (i=0; i10; i+) printf(%d , ai);方法方法2:指针法指针法 void main() int a10; int *p,i; for (p=a; p(a+10); p+) scanf(%d, p); for (p=a; p(a+10); p+) printf(%d , *p);2022-5-637例:用多种方法访问一维数组各元素例:用多种方法访问一维数组各元素void main() int a5,*pa,i; for(i=0;i5;i+) ai=i+1; pa=a; for(i=0;i5;i+)printf(*(pa+%d):%dn,

18、i,*(pa+i); for(i=0;i5;i+) printf(*(a+%d):%dn,i,*(a+i); for(i=0;i5;i+)printf(pa%d:%dn,i,pai); for(i=0;i5;i+)printf(a%d:%dn,i,ai);a0a1a2a3a412345pa2022-5-638例例:int a=1,2,3,4,5,6,7,8,9,10,*p=a,i; 数组元素地址数组元素地址的正确表示:的正确表示: (A)&(a+1)(B)a+(C)&p(D)&pi 数组名是数组名是地址常量,地址常量,下列写法是否正确下列写法是否正确p+,p-a+,a-

19、a+1,*(a+2)( )( )( )2022-5-639例例:注意指针变量的运算注意指针变量的运算int main() int a=5,8,7,6,2,7,3; int y,*p=&a1; y=(*-p)+; printf(%d ,y); printf(%d,a0); return 0; ap输出:输出:5 662022-5-640例:注意指针的当前值例:注意指针的当前值int main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+,p+) printf(%d ,*p); retur

20、n 0;ap指针变量可以指到指针变量可以指到数组后数组后的内存单元的内存单元p=a;58762732022-5-641数组名作函数参数数组名作函数参数实参实参形参形参数组名数组名指针变量指针变量数组名数组名指针变量指针变量数组名数组名数组名数组名指针变量指针变量指针变量指针变量2022-5-642指针与一维数组指针与一维数组2022-5-643例例:用函数实现将一维数组用函数实现将一维数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放void inv(int x,int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=x

21、j; xj=t; void main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参与形参均用数组实参与形参均用数组2022-5-644void inv(int *x,int n) int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; void main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参用数组实参用数组,形参用指针变量形参用指针变量例例:用函数实现将一维数组用函数实现将一维数组a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论