《C语言大学实用教程》指针-课件.ppt

上传人(卖家):ziliao2023 文档编号:6742275 上传时间:2023-08-02 格式:PPT 页数:82 大小:3.23MB
下载 相关 举报
《C语言大学实用教程》指针-课件.ppt_第1页
第1页 / 共82页
《C语言大学实用教程》指针-课件.ppt_第2页
第2页 / 共82页
《C语言大学实用教程》指针-课件.ppt_第3页
第3页 / 共82页
《C语言大学实用教程》指针-课件.ppt_第4页
第4页 / 共82页
《C语言大学实用教程》指针-课件.ppt_第5页
第5页 / 共82页
点击查看更多>>
资源描述

1、 0 内存用户数据区 2000 3 变量 i 2002 6 变量 j 2004 9 变量 k 3010 2000 变量 i_pointer 任何变量在任何变量在存在期间存在期间总有确定存储位置,有固定总有确定存储位置,有固定地址地址。指针的主要操作指针的主要操作 指针赋值:将程序对象的地址存入指针变量。指针赋值:将程序对象的地址存入指针变量。间接访问:通过指针访问被指对象。间接访问:通过指针访问被指对象。指针还能保存其他对象的地址。下面讨论以变量为例。指针还能保存其他对象的地址。下面讨论以变量为例。指针指针p保存着变量保存着变量x地址,也说指针地址,也说指针p指向指向x。图示:图示:指针变量

2、p变量 x图 7.1指针与被指的变量在在C中使用指针常能写出更简洁有效的程序。有些问题中使用指针常能写出更简洁有效的程序。有些问题必须用指针处理。必须用指针处理。指针在大型复杂软件中使用广泛。指针使用的水平是评指针在大型复杂软件中使用广泛。指针使用的水平是评价人的价人的C程序设计能力的重要方面。程序设计能力的重要方面。C指针灵活指针灵活/功能强。掌握有难度,易用错,应特别注意。功能强。掌握有难度,易用错,应特别注意。应特别注意使用指针的常见错误,应特别注意使用指针的常见错误,注意!注意!指针是变量,可赋值,其指向可以改变。指针是变量,可赋值,其指向可以改变。现在现在p指向指向x,以后可能指向以

3、后可能指向y。通过通过p访问被指对象的访问被指对象的语句语句目前访问目前访问x,后来就访问后来就访问y。这种新的灵活性很有用。这种新的灵活性很有用。7.2 指针变量的定义和使用指针变量的定义和使用指针有类型,只能保存指针有类型,只能保存特定类型特定类型的变量的地址的变量的地址指向指向int的指针的指针p只能只能指向指向int变量。常变量。常说说int指针指针p1等。等。指针是指针是变量变量,可赋值取值,有定义域与存在期。应赋给,可赋值取值,有定义域与存在期。应赋给类型正确的指针值,取出的值是特定类型的指针值。类型正确的指针值,取出的值是特定类型的指针值。用用(int*)表示整型指针的类型,其他

4、类似。表示整型指针的类型,其他类似。指针变量可以与其他变量一起定义。指针变量可以与其他变量一起定义。如:如:int *p,n,a10,*q,*p1,m;指针操作指针操作取地址运算符取地址运算符&和间接访问操作和间接访问操作*。都是一元运算符。都是一元运算符指针变量 p变量 n图 7.2两个指针指向同一个变量的情况指针变量 q取地址运算取地址运算&写在变量描述写在变量描述(如变量名)前(如变量名)前取取变量地址,是对应类变量地址,是对应类型的指针值,可赋给类型合适的指针。型的指针值,可赋给类型合适的指针。指针使用前也要指针使用前也要初始化,下面相当于对指针初始化初始化,下面相当于对指针初始化,例

5、:,例:p=&n;q=p;p1=&a1;int i,*p;p=&i;int *p;float*q;p=q;int i;float*p;p=&i;int*p;p=100;指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值 多个指针可能同时指向同一变量。变量相等是值相多个指针可能同时指向同一变量。变量相等是值相等,等,两个指针变量相等说明它们指向程序里同一东西两个指针变量相等说明它们指向程序里同一东西。间接运算符间接运算符*-*p

6、=0;-*p=17;*p=17;m=*p+*q*n;/*访问访问n三次三次*/+*p;/*使变量使变量n的值加的值加1,变成,变成18*/(*p)+;/*使变量使变量n的值再加的值再加1,变成,变成19。*/*p+=*q+n;/*变量变量n被赋以新值被赋以新值57*/q=&a0;/*指针指针q指向了数组指向了数组a的元素的元素*/6000600160026003600460056006p-1pp+1使变量使变量n的值加的值加1,变成,变成18先取出变量先取出变量p所指向的单元中的内容赋给所指向的单元中的内容赋给m,再使,再使p指向下指向下一个地址单元。一个地址单元。实际上,相当于语句:实际上,

7、相当于语句:m=*(p+),可分解为下面两条语,可分解为下面两条语句:句:m=*p;p=p+1;void Swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;main()int a,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);void Swap(int x,int y)int temp;temp=x;x=y;y=temp;main()int a,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);程序程序 1程序程序 2 主调函数主调函数被调被调函数函数实实 参参形形 参

8、参主调函数主调函数被调函数被调函数55ab实实 参参形形 参参99xyabxy55temp9主调函数主调函数被调函数被调函数&a&a实实 参参形形 参参&b&bxyabxy5temp5ab99515 815 815 81515 8815 81515a)调用Swap函数(b)执行Swap函数c)从Swap函数返回temp xy bmain函数Swap函数aaatemptempxxy y bb1588 15&a&b&a&b15(a)调用Swap函数 (b)执行Swap函数 a a b b *x *x *y *y y y x x&a&b main函数 Swap函数 temptemp分析分析:要(在一

9、函数里)通过调用函数:要(在一函数里)通过调用函数g修改调修改调用处的变量(如局部变量),必须在用处的变量(如局部变量),必须在g里里掌握掌握这个变量。这个变量。用指针可以解决问题。用指针可以解决问题。把把m的地址(也是值)通过指针参数的地址(也是值)通过指针参数p传给函数传给函数g,函函数数g内对内对p间接访问就能操作间接访问就能操作m,包括对包括对m赋值(改变赋值(改变m)。)。g 的函数体参数 p变量 m在函数体里用*p 可以访问和改变实参变量 m.图 7.3在函数里通过指针可以访问外面的变量例,通过函数调用把变量值设置为例,通过函数调用把变量值设置为3:void set3(int*np

10、)*np=3;使用实例:使用实例:int main()int n,m;set3(&n);/*设置设置n和和m*/set3(&m);printf(%d,%dn,n,m);return 0;请请回忆回忆scanf的情况。的情况。通过参数改变调用环境的方案通过参数改变调用环境的方案包括三方面:包括三方面:1.函数定义中用函数定义中用指针参数指针参数;2.函数内用函数内用间接操作间接操作实际变量;实际变量;3.调用时以被操作调用时以被操作变量的地址变量的地址作为实参。作为实参。函数函数swap可定义为:可定义为:void swap(int*p,int*q)int temp;temp=*p;*p=*q;

11、*q=temp;交换变量交换变量m和和n的值,调用形式是:的值,调用形式是:swap(&m,&n);swap的参数类型是的参数类型是(int*),实参实参必须是必须是合法的整型合法的整型变量的地址。变量的地址。swap 的函数体p变量 m图 7.4函数调用 swap(&m,&n)形成的现场变量 nq设有变量定义:设有变量定义:int a10,k;调用调用swap的实例:的实例:swap(&a0,&a5);swap(&a1,&k);介绍标准库函数介绍标准库函数scanf时,强调在接受输入的变量前必时,强调在接受输入的变量前必须写须写&,就是将变量的地址传给,就是将变量的地址传给scanf。sca

12、nf采用与采用与swap一样的技术,通过间接访问为指定一样的技术,通过间接访问为指定变量赋值,把输入的值赋给指定变量。变量赋值,把输入的值赋给指定变量。与指针有关的一些问题与指针有关的一些问题空指针值:空指针值:一个特殊指针值,表示指针变量闲置(未一个特殊指针值,表示指针变量闲置(未指向任何变量)。唯一对任何指针类型都合法的值指向任何变量)。唯一对任何指针类型都合法的值空指针值用空指针值用0表示,标准库专门定义了符号常量表示,标准库专门定义了符号常量 NULLp=NULL;和和p=0;相同相同前一写法易看到是指针,用时必须包含标准头文件。前一写法易看到是指针,用时必须包含标准头文件。指针初始化

13、指针初始化指针变量定义时可用合法指针值初始化:指针变量定义时可用合法指针值初始化:int n,*p=&n,*q=NULL;若没有初始化,若没有初始化,外部指针外部指针和和局部静态指针局部静态指针自动初始化自动初始化为用空为用空;局部自动指针不自动初始化局部自动指针不自动初始化。指针使用中的常见错误指针使用中的常见错误使用指针的最常见错误是使用指针的最常见错误是非法间接访问非法间接访问:在指针未指:在指针未指向合法变量的情况下做间接。如:向合法变量的情况下做间接。如:int f(.)int*p,n=3;*p=2;.p没有初始化,没有初始化,没有指向合法变量。没有指向合法变量。“悬空指针悬空指针”

14、指值不是(当时)合法的变量地址的指指值不是(当时)合法的变量地址的指针变量,也常被称为针变量,也常被称为“野指针野指针”。间接访问悬空指针是严重错误,后果可能很严重。间接访问悬空指针是严重错误,后果可能很严重。常见错误写法(设常见错误写法(设p是悬空是悬空int指针,指针,n是是int变量):变量):swap(p,&n);scanf(.,p);scanf(.,n);编译程序不能发现编译程序不能发现scanf的错误。有些系统可能对第的错误。有些系统可能对第一个例子(假设一个例子(假设p未初始化)给出警告未初始化)给出警告。间接访问空指针也同样无理,是非法的。间接访问空指针也同样无理,是非法的。p

15、 r o g r a m m i n g 0 指针p p r o g r a m m i n g 0 数组a(a)(b)定义字符指针时可用字符串常量初始化,如:定义字符指针时可用字符串常量初始化,如:char*p=Programming;1)定义了指针)定义了指针p2)建立了一个字符串常量,内容为)建立了一个字符串常量,内容为Programming3)令)令p指向该字符串常量。指向该字符串常量。图图(a)char a=Programming;1)定义了一个)定义了一个12个字符元素的数组个字符元素的数组2)用)用Programming各字符初始化各字符初始化a的元素,图的元素,图(b)1)指针

16、指针p可重新赋值可重新赋值(数组不能赋值(数组不能赋值,只能通过只能通过字符串字符串复制复制的方法或者为的方法或者为每个元素重新赋值每个元素重新赋值的方法):的方法):p=Programming Language C;2)p和和a类型不同,大小不同。类型不同,大小不同。a占占12个字符的空间。个字符的空间。3)a的的元素元素可以重新赋值。可以重新赋值。如:如:a8=e;a9=r;a10=0;a的内容现在变成的内容现在变成“Programmer”按按规定,字符串常量不得修改规定,字符串常量不得修改 p r o g r a m m i n g 0 指针p p r o g r a m m i n g

17、 0 数组a(a)(b)下标:0 1 2 3 4 5 6 7 8 9 10 11 HelloChina0HelloChina0srcStridstStri下标移动方向dstStri=0srcStrdstStr结束拷贝ii+i 当只允许函数访问地址内容,不允许修改当只允许函数访问地址内容,不允许修改时,可以把函数的指针参数定义为时,可以把函数的指针参数定义为constHelloChina0HelloChina0*srcStr*dstStr指针移动方向指针移动方向*to=0dstStrsrcStr+srcStrsrcStrdstStr+dstStr7.3 指针与数组指针与数组C指针与数组关系密切,

18、以指针为媒介可以完成各种数指针与数组关系密切,以指针为媒介可以完成各种数组操作。常能使程序更加简洁有效。组操作。常能使程序更加简洁有效。用指针做数组操作同样要用指针做数组操作同样要特别注意特别注意越界错误。越界错误。指针和数组的关系是指针和数组的关系是C语言特有的,除了由语言特有的,除了由C派生出的派生出的语言(如语言(如C+),),一般语言中没有这种关系。一般语言中没有这种关系。指向数组元素的指针指向数组元素的指针类型合适的指针可以指向数组元素。类型合适的指针可以指向数组元素。假定有定义:假定有定义:int*p1,*p2,*p3,*p4;int a10=1,2,3,4,5,6,7,8,9,1

19、0;可以写:可以写:p1=&a0;p2=p1;p3=&a5;p4=&a10;p4没没指向指向a的元素,是指向的元素,是指向a最后元素向后一个位置。最后元素向后一个位置。C语言保证这个地址存在,但写语言保证这个地址存在,但写 *p4 是错误的。是错误的。数组 a p1 图 7.5 指向数组 a 的元素的 4 个指针 p2 p4 p3 写数组名得到数组首元素地址,元素类型的指针值写数组名得到数组首元素地址,元素类型的指针值。“p1=&a0;”可简写为:可简写为:p1=a;指针运算指针运算 当指针当指针p指向数组元素时说指向数组元素时说p指到了数组里指到了数组里。这时由。这时由p可以访问被可以访问被

20、p指的元素,还可访问数组的其他元素。指的元素,还可访问数组的其他元素。例:例:p1指向指向a首元素首元素,值合法(,值合法(a0的地址),的地址),p1+1也合法(也合法(a1的地址)。的地址)。p1+2、p1+3、也合法,分也合法,分别为别为a其他元素的地址。由它们可间接访问其他元素的地址。由它们可间接访问a各元素。各元素。例:例:*(p1+2)=3;/*给给a2赋值赋值*/p2=p1+5;/*使使p2指向指向a5*/也可由指向非首元素的指针出发访问数组其他元素:也可由指向非首元素的指针出发访问数组其他元素:*(p2+2)=5;/*给给a7赋值赋值*/可用减法访问所指位置之前的元素:可用减法

21、访问所指位置之前的元素:*(p2-2)=4;/*给给a3赋值赋值*/通过指针访问数组元素时必须保证不越界。通过指针访问数组元素时必须保证不越界。运算取得的指针值(即使不间接访问)必须在数组范运算取得的指针值(即使不间接访问)必须在数组范围内(可过末元素一位置),否则无定义。围内(可过末元素一位置),否则无定义。这类运算称为这类运算称为“指针运算指针运算”。其他常用指针运算:。其他常用指针运算:用指针运算得到的值做指针更新:用指针运算得到的值做指针更新:p2=p2-2;/*这使这使p2改指向改指向a3*/用增用增/减量操作做指针更新(指针应指在数组里):减量操作做指针更新(指针应指在数组里):p

22、3=p2;+p3;-p2;p3+=2;如果两指针指在同一个数组里,可以求差,得到它们如果两指针指在同一个数组里,可以求差,得到它们间的数组元素个数(带符号整数)。间的数组元素个数(带符号整数)。n=p3 p2;/*也可以求也可以求 p2 p3*/指在同一个数组里指在同一个数组里的指针的指针可以比较大小:可以比较大小:if(p3 p2).当当p3所指的元素在所指的元素在p2所指的元素之后时条件成立所指的元素之后时条件成立(值(值为为1),否则不成立(值为),否则不成立(值为0)。两个指针不指在同一数)。两个指针不指在同一数组里时,比较大小没有意义。组里时,比较大小没有意义。两个同类型指针可用两个

23、同类型指针可用=和和!=比较相等或不等;任比较相等或不等;任何指针都能与通用指针比较相等或不等,任何指针可何指针都能与通用指针比较相等或不等,任何指针可与空指针值(与空指针值(0或或NULL)比较相等或不等。比较相等或不等。两指针指向同一数据元素,或同为空值时它们相等。两指针指向同一数据元素,或同为空值时它们相等。数组写法与指针写法数组写法与指针写法如果一个如果一个指针指针指在一个数组里,通过指针访问数组元素指在一个数组里,通过指针访问数组元素的操作也可用下标形式写的操作也可用下标形式写。设设p1指向数组指向数组a0,p3指向指向a5。可写:。可写:p13=5;p32=8;p13一类写法称为一

24、类写法称为数组写法数组写法,*(p+3)一类写法称为一类写法称为指针写法指针写法。两类写法有两类写法有等价效力等价效力,可以自由选用。,可以自由选用。60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+1 3 5 7 9a0 a1 a2 a3 a4 a5插入位置pos x=4x插入前:1 3 4 5 7 9 x插入后:插入元素xa0 a1 a2 a3 a4 a5a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a

25、1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2 a23;weekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday0weekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday0 xSunday0a00a01a02a10

26、a11a12pp+a00a01a02a10a11a12pp+能返回这两个值吗?能返回这两个值吗?指针参数指定了存放指针参数指定了存放这两个值的地址这两个值的地址能这样传递能这样传递m个班(每个班(每班班n个学生)的成绩吗?个学生)的成绩吗?由此可见,此处的由此可见,此处的p是列是列指针指针指定存储指定存储m个班(每班个班(每班n个学生)成绩的首地址个学生)成绩的首地址strPascalBasicFortranJava二维数组二维数组字符串字符串Visual CPascalBasicFortranJavaptr指针数组指针数组字符串字符串ptrVisual C name0 P a s c a l

27、 0 0 0 0 name1 B a s i c 0 0 0 0 0 name2 F o r t r a n 0 0 0 name3 J a v a 0 0 0 0 0 0 name4 V i s u a l C 0 0 name0 B a s i c 0 0 0 0 0 name1 F o r t r a n 0 0 0 name2 J a v a 0 0 0 0 0 0 name3 P a s c a l 0 0 0 0 name4 V i s u a l C 0 0 指针数组指针数组ptr 字符串排序前字符串排序前Pascal0Basic0Fortran0Java0Visual C0ptr0ptr1ptr2ptr3ptr4 指针数组指针数组ptr 字符串排序后字符串排序后Pascal0Basic0Fortran0Java0Visual C0ptr0ptr1ptr2ptr3ptr4echo.exeprogrammingisfunptr指针数组指针数组字符串字符串name

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(《C语言大学实用教程》指针-课件.ppt)为本站会员(ziliao2023)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|