C语言程序设计 教学课件 ppt 作者 张树粹 孟佳娜 第7章 指针

上传人:E**** 文档编号:89344606 上传时间:2019-05-23 格式:PPT 页数:98 大小:1.08MB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者  张树粹 孟佳娜 第7章 指针_第1页
第1页 / 共98页
C语言程序设计 教学课件 ppt 作者  张树粹 孟佳娜 第7章 指针_第2页
第2页 / 共98页
C语言程序设计 教学课件 ppt 作者  张树粹 孟佳娜 第7章 指针_第3页
第3页 / 共98页
C语言程序设计 教学课件 ppt 作者  张树粹 孟佳娜 第7章 指针_第4页
第4页 / 共98页
C语言程序设计 教学课件 ppt 作者  张树粹 孟佳娜 第7章 指针_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 张树粹 孟佳娜 第7章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 张树粹 孟佳娜 第7章 指针(98页珍藏版)》请在金锄头文库上搜索。

1、第7章 指针,计算机学院 C 课组,定义指针 指针是一种特殊的数据类型,其值是数据的内存地址。 指针变量是存放数据的内存地址的一种变量。 正确地使用指针变量能够快速、方便地访问内存,实现函数间的通信,可以设计出简洁、高效的C语言程序。正是因为指针使用上的灵活性,同时,指针使用也具有危险性,使用不当会造成许多意想不到的错误。,7.1 指针和指针变量,7.1.1 指针 当要运行程序时,相应的程序代码(完成各种动作的机器指令)和数据必须存入到内存中,占用内存的用户区。在C源程序中定义的变量,系统在编译时就为它们分配相应的内存单元。例如: int x=2; float y=3.0; char ch=1

2、a1;,了解变量、变量的地址、变量的值,7.1.2 指针变量,地址一种是特殊的常量,存放地址常量的变量就称为指针变量。,C程序执行时,CPU并不直接识别变量名,而是通过该变量的内存地址访问其值的。,C语言访问变量的两种方式: 直接访问方式 间接访问方式(通过指针访问),7.2 指针变量的定义、初始化和引用,存储类型 数据类型 *指针变量名=初始地址值; 例如:int i,*p= 我们对指针的值并不感兴趣,主要使用指针访问变量的值,也就是地址里的内容。 注意,注意,(1)指针变量也占用内存单元,所有指针变量占用内存单元的数量都是相同的。 (2)“*”表示该变量为指针变量,以区别于普通变量,而指针

3、变量名并不包含“*”。 (3)从语法上讲,指针变量可以指向任何类型的对象,包括数组、指针变量、函数或结构型变量等,从而可以表示复杂的数据类型。,7.2.2指针变量的初始化,指针变量的初始化,即在定义的同时,给其赋初值。 存储类型 数据类型 *指针变量名=初始地址值; 例如: int i,*p= &:取地址运算符,7.2.3指针变量的引用,1. 指针运算符 (1) 在形式上虽然与位操作中的“按位与”运算符完全相同,但“按位与”运算符是二元运算符,二者在使用上不会发生混淆。,当变量或数组定义后,就可以用 运算符 来查看它们的地址。 #include main() int a=2; float b=

4、3; double c=3; char d5; printf(“address of a is:%pn“, ,(2)* 指针运算符,* 是单目运算符,其结合性是由右向左的。它的作用是取指针变量所指向的地址里所存放的内容,即通过指针变量来间接访问它所指向的变量。 例如: int i=10,*p; p= 它们都表示给i赋值为10。,& 和 *间的运算,若有以下定义: int i,*pi= 而“&*pi”相当于“&(*pi)”,先取 pi 所指向的变量的值即 i ,然后再取i的地址,也就是pi 。,2指针变量的引用,【例7.2】指针变量的引用举例。 #include main() int i,*pi

5、; pi= ,【例7.3】输入两个整数,然后按大小顺序输出。,#include main() int *p,*q,*r,a,b; printf(“input a and b: “); scanf(“%d,%d“, ,注意,指针变量在使用之前,必须赋给一个确定的地址值,否则不能使用。例如下面的用法是危险的。例如: int *p; *p=10; (P没有指向) 这里指针p并没有赋值,其指向是不定的,常常会破坏内存中其他单元的内容,严重时会造成系统失控。当指针变量未赋值时,其值不确定,对这个地址的访问将得到错误的结果。 可以把指针变量初始化为空指针。 int *p=NULL NULL是系统定义的符号

6、常量,其ASCII码的值取为0。 在一般情况下指针变量只能指向由定义限定的同一类型的变量,若要指向其它类型的变量要进行强制类型转换。,7.3 指针的运算,指针的运算是以指针变量所特有的地址值为运算量进行的运算,因此,指针运算的实质是地址的计算。 指针运算的种类是有限的,除其特有的两种运算符 & 和 * 外,它只能进行: 赋值运算 算术运算 关系运算,7.3.1 指针的赋值运算,1初始化赋值, 例如: int a; int *p=,4. 将数组的首地址赋给指向数组的指针变量 例如: int a5,*pa; pa=a; 也可写成:pa= 其中,f为函数名。,7.3.2 指针的算术运算,p+(或+p

7、)、p(或-p) *和+(-)是同级别(自右向左)运算符.,指向下一个(上一个)数据地址,*p+ 和(*p)+ 的区别 int i=10, *pi= *p+ *(p+) 表示取p所指向的变量的值,i=10 然后p作自加运算,指针后移; p指向2002。 (*p)+表示取*p的值,然后(*p)作自加运算。 p指向2000,i=11,复习一下*+p和+ (*p)的区别,*+p表示: 先使p作自加运算 然后取p当前所指单元的值; + (*p)表示: 先使p所指单元的值 再作加1运算 int i=10, j,*pi= 结果是: i=10,j=11,p指向2000。,2. p+n、p-n(其中n为整型常

8、量),将指针p加或减一个整数n,表示p向地址后或前的方向移动n个数据单元,每个数据单元的字节数取决于指针的数据类型。 当前地址n1个数据的长度 例如, float p; 则p+2 表示p的地址值增24个字节。 常用于数组,3. p-q p-q (p,q为同一类型的指针),表示p所指元素与q所指元素之间的元素个数 结果值不是地址量,它的执行过程是地址值相减后除以其数据类型的长度,即(p-q)元素数据类型长度。 【例7.4】两个同类型指针相减举例。 #include main() float x5,*p,*q; p= ,7.3.3 指针的关系运算,指针的关系运算包括:、=、q 结果为假 p+= =

9、q; 结果为假 p!=q 结果为真 p=&a6 结果为真 注意: 指向不同数据类型的指针变量之间不能进行关系运算。 任何指针变量或地址都可以与NULL作关系运算,通常是使用p=NULL或p!=NULL。,7.4 指针变量作函数的参数,【例7.5】分别使用传值和传地址的方式编写程序,交换两个整数的值。(1) 变量值传递,void swap(int x,int y) int temp; temp=x; x=y; y=temp; main() int a,b; printf(“input a and b: “); scanf(“%d,%d“, ,(2) 指针变量接收传来的地址值,内容对调。 void

10、 swap(int *p,int *q) int temp; temp=*p; *p=*q; *q=temp; /*内容对调*/ main( ) int a,b; printf(“input a and b: “); scanf(“%d,%d“, ,程序(1)实参将值传递给形参,形参的值发生了交换,但并没有改变实参的值。 程序(2)调用swap函数时,将变量a,b的地址赋给指针变量p,q,即实参和形参占用相同的内存单元,对调的是内容。 temp=*p; *p=*q; *q=temp;,(3) 指针指向改变了, a,b得不到改变。 swap(int *p,int *q) /*形参为指针变量*/

11、int *temp; temp=p; /*指针的指向对调*/ p=q; q=temp; /*指针的指向对调,调用返回后a,b并无改变*/ main( ) int a,b; printf(“input a and b: “); scanf(“%d,%d“, ,程序(3)调用swap函数后,同样指针p指向a,指针q指向b,并且实参和形参占用相同的内存单元, temp=p; p=q; q=temp;,【例】用字符指针作为函数的参数求字符串的长度,#include int length(char *ptr) char *p=ptr; /*指针变量p指向字符串*/ while(*p!=0) /*读字符串

12、,直到结束*/ p+; /*p后移动1 个字符*/ return p-ptr; /*p的当前内存单元编号与首地址做减运算*/ main() char *string=“I am a student“; printf(“the length of string “%s“ is %d“,string,length(string); /*传递的是字符串的首地址*/,7.5 指针与数组,在C语言中,指针与数组有着十分密切的关系。 访问数组元素有两种方法:下标法和指针法 任何能由数组下标完成的操作都能由指针来实现,而且使用指针比用下标对数组元素的存取操作更方便,速度更快。 数组的指针指向数组的起始地址;

13、 数组元素的指针是数组元素的首地址;,7.5.1 一维数组的指针表示方法,下标法:采用ai的形式引用数组中的元素 指针法:采用*(p+i)的形式引用数组中的元素 数组的首地址表示:例如:int a10, p; p=a; (或p=),下标运算符“ ”: 实际上是变址运算符。对ai的求解过程是: 先按a+id计算数组元素的地址,然后找出此地址所指向的单元中的值。 p+i: 也在变址,即ai的地址。 数组元素ai 的表示: ai*(p+i),ai*(a+i) 若: int a10,*p=a; 则 a5=10; *(p+5)=10; *(a+5)=10; 指向数组元素的指针变量也可以使用“ ”运算符表

14、示数组元素,形式为:pi *(p+i) 上例: a5=10; *(p+5)=10; *(a+5)=10; pi =10;P166,指针与数组名的使用,在某些情况下,数组名和指针变量名可以混用。 但是,指针变量可以作为赋值表达式的赋值对象使用、可以进行自增(减)等运算,可以指向数组中的任一元素; 而数组名虽然表示数组的起始地址,但它是常量,在程序运行期间是固定不变的。 p+是合法的,但用a+是错误的。 表7.2指针p与一维数组a的关系,数组、地址表示方法,P是变量,可以做p+运算,但a是数组,不可以做a+运算。,【例7.6】采用指针法输出数组的全部元素,#include main( ) int a10,i; int *p; printf(“input the elements of array a:“); for(i=0;i10;i+) scanf(“%d“, /*通过指针访问数组的各元素*/ ,【例7.7】采用指针法从键盘输入10个整型数,并输出其中的最大值。,#include main() int a10,i,max; int *p; p=a; for(i=0;imax) max=

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

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

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