C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针

上传人:E**** 文档编号:89422863 上传时间:2019-05-25 格式:PPT 页数:50 大小:407KB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针_第1页
第1页 / 共50页
C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针_第2页
第2页 / 共50页
C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针_第3页
第3页 / 共50页
C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针_第4页
第4页 / 共50页
C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 吴赟婷 卢钢 第8章 指针(50页珍藏版)》请在金锄头文库上搜索。

1、第8章 指针,8.1 指针与指针变量 8.2 指针与函数 8.3 指针与数组 8.4 指针与字符串 8.5 指针运用举例,8.1 指针与指针变量,8.1.1 指针的概念,计算机内存被分成一个一个字节,这些连续的字节都有属于自己的一个地址编号,这个编号就是存储单元的地址。,例如,定义一个int a; 在内存中分配连续的四个字节给int 型的变量 a使用。,虽然a的四个字节都有地址编号,但是把第一个字节的地址当成a的地址, 即&a为2000,地址是存储单元的编号 ,指针就是地址,8.1.2 指针变量,专门用来保存其它变量的地址值的变 量,称为指针变量。,1.指针变量的定义 定义格式如下: 基类型

2、* 指针变量名 例如: int * p;/*定义了一个用来指向整型变量的指针变量 p*/ float * q;/*定义了一个用来指向实型变量的指针变量 q*/,说明: 基类型约束指针变量只能保存基类型变量的地址。所以,int * p;意味着p只能保存int型变量的地址。 “*”在指针变量定义语句中只是一个身份标识,表明此处定义的是用来存储其他变量地址的指针变量,而不是普通变量。 不管基类型是什么,作为指针变量,只能保存地址值,不能用来随便保存其它的数据,否则会出错或造成不可预知的不良后果。,2.指针变量的使用,定义了一个指针变量,我们就可以用它来 存储其他变量空间的地址了。,例如: 1.int

3、 * p; 2. float * q; 3.int x=3; 4. float y=4.5; 5. p=/*把一般实型变量y的地址存储在指针变量q中。*/ 7. printf(“%x,%x”,p,q); 8. printf(“%d,%f”,*p,*q);,说明: 在给指针赋地址值时,在类型上应该保持一致,如果上例有p=,第二,还可以把相同类型的指针变量进行赋值。 如int *p,*r,x;p= 第三,还可以给指针变量赋NULL值,事实上,为了保证指针访问的安全性,我们在定义了一个指针变量时,一般都要给其赋初值,或者给它赋NULL值。 如int * t=NULL; 第7条语句的作用是输出指针p和

4、q存储的x与y的地址值。请注意是地址值,不是3和4.5 。,关于“*”的含义。 在定义的地方出现时,只是作为一个身份标志,表面其后面定义的是一个指针变量。 作为指向运算符。如*p的作用是把指针p里面保存的地址(即x的地址)取出,并按照该地址去找到对应空间(x的空间),最后取出该空间里面的数。 因此,若有int *p, x=3; p=,当如果有以下定义: int * p; double * q; int x=3; double y=4.5; p=,内存分配结构如下图,8.2 指针与函数,在函数中,函数定义和使用都涉及到两种参数(形参和实参)。 当形参被定义成一般数据类型时,函数调用则采用单向的值

5、传递进行传值, 当形参被定义成指针类型时,采用的则为双向的地址传递传值。,【例8-1】用两种不同的传值方式实现两个整数交换的函数,并在主函数中调用它们来交换两个整数。,#include void swap1(int x,int y) /*使用普通单向值传递作为参数*/ int z; z=x; x=y; y=z; void swap2(int *x,int *y) /*使用指针作为参数是双向地址传递*/ int z; z=*x; *x=*y; *y=z; ,main() int a,b; scanf(“%d%d“, ,再来考虑下面这个程序,看看结果又如何? #include void swap(

6、int *x,int *y) int *z; z=x; x=y; y=z; main() int a,b; scanf(“%d%d”, ,这里一样使用指针做参数,为什么函数调用却没影响实参的值呢? 注意这里实际交换的是什么?,8.3 指针与数组,数组给编程者带来的方便不言而喻了,对数组的使用除了使用数组名,还可以通过指针来操作数组。而且在某些方面使用指针操作数组比使用数组名更方便。,8.3.1 指针与一维数组,1.使用指针操作数组元素 可以使用指针变量来指向一个数组的起始地址,这样就可以通过指针变量来访问数组的所有元素。也可以使用指针变量直接来指向数组的某一个元素。因此灵活使用指针可以更方便的

7、使用数组。,int a3; int *p,*q; p=a; q=,指针p指向了数组的起始地址a,而指针q指向了数组的最后一个元素a2,【例8-2】使用指针操作数组元素的例子 #include main() int a4=1,2,3,4; int *p,i; p=a; for(i=0;i4;i+) printf(“%d,”,ai); printf(“n”); for(i=0;i4;i+) printf(“%d,”,pi); printf(“n”); p= ,使用数组名访问数组元素,使用指针访问数组元素,使用指针访问数组元素,2.指针与数组名的比较 如果指针变量p指向数组的一个元素时,p+1则指向

8、该元素的下一个元素(注意,不是将p简单的移动一个字节)。 例如,当p指向一个int数组时,每个数组元素占4个字节,那么p+则是使p移动连续的4个字节,指向紧接的下一个元素了。 如果有int a5,*p=a;则p+i和a+i都是数组元素ai的地址。也意味着*(p+i)和*(a+i)其实就是数组元素ai的其他表示形式。,【例8-3】使用三种不同方式输出数组元素。 #include main() int a5=1,2,3,4,5; int i,*p=a; for(i=0;i5;i+) printf(“%d,”,ai); /*使用 ai输出数组*/ printf(“n”); for(i=0;i5;i+

9、) printf(“%d,”,*(a+i);/*使用a+i输出数组*/ printf(“n”); for(i=0;i5;i+) printf(“%d,”,*(p+i);/*使用p+i输出数组*/ printf(“n”); ,在使用指针操作数组时,应该注意以下几个问题: (1)上面的指针变量p可以通过不停加1的方式来使得p从第一个元素开始依次指向数组中的每一个元素,使用p+来遍历数组元素是比较方便的。但是注意数组名不具有这个性质,因为数组名是地址常量。 (2)在指针移动的过程中,作为编程者来说,要时刻记住指针当前的指向。不然容易出现一些莫名其妙的错误。,有以下代码,功能是使用指针变量来输入和输出

10、一个数组。 #include main() int a5,i,*p; p=a; for(i=0;i5;i+,p+) /*使用指针变量p输入这个数组*/ scanf(“%d”,p); /*注意这里的p其实就是地址,不能用 ,(3)指针变量的运算非常灵活。下面来介绍几种容易混淆的运算: *p+。由于*和+的运算符优先级相同,并且都是右结合的。所以等价于*(p+)而不等价于(*p)+。 *(p+)与(*p)+的区别。*(p+)表示将p所指的内存单元中数值取出来,然后p再指向下一个元素,改变的是p的指向。而(*p)+则表示将p所指的内存单元中的数值自增1,改变的是p所指向的内存单元的值。,8.3.2

11、指针与二维数组,二维数组可以看成元素为一维数组的数组。 例如,当定义一个二维数组时,int a23; 分配了两个一维数组的空间,分别为a0,a1,而每个一维数组里面有三个成员组成,a0中包括a00 , a01,在a1中包括a10,a11,a12。,【例8-4】二维数组与指针的使用。 #include main() int a23=1,2,3,4,5,6; int *p=a; int i,j; printf(“使用aij访问数组元素:n“); for(i=0;i2;i+) for(j=0;j3;j+) printf(“%d,“,aij); printf(“n“); printf(“使用*(*(a

12、+i)+j)访问数组元素:n“); for(i=0;i2;i+) for(j=0;j3;j+) printf(“%d,“,*(*(a+i)+j); printf(“n“); ,/*通过下面方式访问二维数组会出现错误,这里注释了 printf(“使用*(*(p+i)+j)访问数组元素:n“); for(i=0;i2;i+) for(j=0;j3;j+) printf(“%d,“, *(*(p+i)+j); printf(“n“); */ printf(“使用*(p+i)访问数组元素:n“); for(i=0;i6;) printf(“%d,“, *(p+i); if(+i%3=0) printf

13、(“n“); printf(“使用pi访问数组元素:n“); for(i=0;i6;) printf(“%d,“, pi); if(+i%3=0) printf(“n“); ,注意:在一维数组中, 如果有int x3=1,2,3;int *p=a; 可以用p直接以pi的形式访问xi元素,但是二 维数组则不可以这么等价访问了, 例如有int a23;int * q=a;如果用qij来访 问数组元素时,则出现编译错误。,8.4 指针与字符串,在C语言中,只有字符型没有字符串型。所以字符串的处理必须依靠其他的数据类型来实型。我们主要使用字符数组和字符指针来处理字符串。,1.使用字符数组存放一个字符串

14、 例如: #include main() char str= “hello,C!”; printf(“%s”,str); ,注意事项: 使用字符数组保存字符串时,特别注意数组的长度一定要大于等于字符串的字符个数,因为作为字符串常量,系统一定会在字符串最后加一个0作为结束。,2.使用字符指针指向一个字符串 例如 #include main() char *str= “hello,C!”; printf(“%s”,str);/*从str地址开始输出,直到遇到0结束*/ ,使用字符指针注意事项: (1)使用字符指针保存一个字符串,常常会引起学习者的误会,认为系统把长长的一串字符串都保存在一个字符指针

15、中去了,作为字符指针,它只能保存一个字符数据的地址,根本保存不了一串字符。系统只是把字符串包括字符串后面的结束标志0存储在一段连续的空闲区域,然后把字符串的第一个字符的地址赋给字符指针str保存。这样,通过指针变量记录字符串的起始地址,通过0结束它,可以有效的保存一串字符串了。,(2)对比下面三种方式:,方式三: #include main() char *str; scanf(“%s”,str); printf(“%s”,str);,方式二: #include main() char str6; str=“hello”; printf(“%s”,str); ,方式一: #include main() char *str; str=“hello”; printf(“%s”,str); ,正确,错误,错误,(3)通过对指针变量的移动,可以访问字符串中任何位置的字符。,例如: #include main() char *a=“abcdefghijklmn”; a=a+3; /移动指针a,往后移动三个位置,指向字符d printf(“%c”,*a); /输出移动后指针a指向的字符 printf(“n”); /换行 printf(“%s”,a); /输出移动后指针a指向的字符及后 面所

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号