C程序设计 教学课件 ppt 作者 赵山林 10

上传人:E**** 文档编号:89344522 上传时间:2019-05-23 格式:PPT 页数:68 大小:351KB
返回 下载 相关 举报
C程序设计 教学课件 ppt 作者  赵山林 10_第1页
第1页 / 共68页
C程序设计 教学课件 ppt 作者  赵山林 10_第2页
第2页 / 共68页
C程序设计 教学课件 ppt 作者  赵山林 10_第3页
第3页 / 共68页
C程序设计 教学课件 ppt 作者  赵山林 10_第4页
第4页 / 共68页
C程序设计 教学课件 ppt 作者  赵山林 10_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《C程序设计 教学课件 ppt 作者 赵山林 10》由会员分享,可在线阅读,更多相关《C程序设计 教学课件 ppt 作者 赵山林 10(68页珍藏版)》请在金锄头文库上搜索。

1、,第10章 指针,指针是C语言中一个十分重要的概念。指针的引入极大地丰富了语言的功能,利用指针可以直接对内存中各种不同类型的数据进行快速访问,可以有效地表示、访问复杂的数据结构,可以方便灵活地在函数间传递数据,可以提高某些程序的执行效率,实现对底层硬件的访问。,10.1 指针的基本概念 10.2 指 针 变 量 10.3 数组的指针 10.4 函数的指针和返回指针值的函数 10.5 指针数组与指向指针的指针,10.1 指针的基本概念 10.1.1 变量的直接访问和间接访问 变量是程序中数据所占存储单元的符号。程序在编译时,系统会根据变量定义的数据类型为其分配相应的内存单元,用于存放变量的具体数

2、据。不同类型的变量所分配的内存单元的长度是不一样的。通常,将变量所分配内存单元的首地址(即变量所分配的低字节地址)称为变量的地址。另外,系统还产生一张“变量名、地址对应关系表”,用来记录变量名与地址之间的关系,每一个变量名对应一个地址。在程序中使用变量,就是通过“变量名、地址对应关系表”所记录的变量地址来访问相应的内存单元,变量的值就是内存单元的内容。,通过变量地址可以找到该变量所占的存储单元,因此可以说变量地址“指向”变量的存储单元。这种直接按照变量地址访问变量的方式称为“直接访问”,如图10.2所示。,图10.2 变量访问方式示意图,这种把变量地址存放在一个特殊变量中,然后通过访问特殊变量

3、的值(地址),再由此地址找到最终要访问的变量的方法,称为“间接访问” 。,10.1.2 指针与指针变量 变量的地址称为变量的指针,例如,”。,定义另外一种特殊类型的变量。这种特殊的变量专门用来存放其他变量的地址。例如: int *p; p= *p=685;,定义了一个特殊变量p,假设它代表地址5002H指向的内存单元,在该内存单元中存放了变量a的地址,10.2 指 针 变 量,10.2.1 指针变量的类型和指针变量指向变量的关系,1指针变量的定义 类型标识符 *指针变量名; 其中类型标识符表示指针变量所指向数据的类型,又称为指针变量的基类型。基类型可以是整型、实型、字符型、数组、结构体等各种数

4、据类型。“*”为指针变量的定义符,表示定义的是一个指针变量,而指针变量名本身不包含“*”,2指针变量的初始化 (1)在定义的同时进行初始化。 例如: int a; int *p=,(3)可以用初始化了的指针变量给另一个指针变量做初始化值。 例如: int x ; int *p=,10.2.2 指针变量的引用 1取地址运算符& 取地址运算符&是单目运算符,用于变量名之前,表示该变量的存储地址。 2指针运算符* 指针运算符*又称为间接访问运算符,是单目运算符,用来表示指针变量所指向的变量。在*运算符之后跟的操作对象必须是指针。,例10.1 这个小程序连接了本节中的程序片段,并且添加了输出语句来显示

5、变量的内容和地址。 #include “stdio.h“ main() int *p; int a,b,*p1,*p2; float x,y,*pf; p=NULL; printf(“,printf(“ 程序运行结果为 &p=ffc8,p=0,*p=0 &a=ffca,a=685 &p1=ffce,p1=ffca,*p1=685 &p2=ffd0,p2=ffcc,*p2=64 &p2=ffd0,p2=ffcc,*p2=695 &x=ffd2,x=6.83 &pf=ffda,pf=ffd2,*pf=6.83 &y=ffd6,y=6.83,例10.2 从键盘输入两个整数给变量m与n,不改变m与n的

6、值,按照从小到大的顺序输出。 main() int m,n; int *p,*p1,*p2; p1= ,程序运行情况为: please input m,n: 10,8 m=10, n=8 min=8, max=10,图10.5 利用指针从小到大输出两个数,10.2.3 指针的运算 指针运算是以指针变量所特有的地址值为运算量进行的运算。 1赋值运算(=) 指针赋值运算是将某个地址赋给指针变量。 例如: int a,b; int *p1,*p2; p1=,2算术运算 指针的算术运算包括:指针的加1、减1运算,指针与整数的加、减运算以及指针相减运算。 (1)指针的自增自减运算(+, ) 因为指针执行

7、自增自减运算时按它所指向数据类型的字节长度为单位进行运算。不同数据类型的数据所占的内存字节数是不同的,指针自增自减运算后,地址变化的字节数也是不同的。p+运算相当于p=p+d,其中d是p指向变量在内存中分配的字节数,对于int而言d值为2,char是1,long int 是4,float是4,double是8。如果p指向其他构造类型变量(x)时,d的值是sizeof(x)(sizeof运算符是计算变量在内存中所占的字节数),(2)指针与整数的加、减运算 与指针的自增自减运算类似,C语言中指针变量加上(或减去)一个整数n,如p+5相当于p+5*d(d为变量所占的字节数)。 例如: float x

8、,*pf= 假设变量x的地址为4000H,则pf+5所表示的地址值为:4000H+54=4014H。,(3)指针相减运算 C语言中允许类型相同的两个指针相减,操作结果是两个指针之间的数据个数,实际上是两个指针值(地址)相减之差再除以该数据类型的长度(字节数)。例如p和q是指向同一浮点数组的两个指针变量,设q的值为2020H,p的值为2000H,而浮点数组每个元素占4个字节,所以p-q的结果为(2020H2000H)/4=8,表示p和q之间相差8个元素。,3关系运算 两个指针之间的关系运算可表示它们所指向的变量的存储位置的前后关系。例如,指针p与q之间的关系比较: pq 当表达式成立时表示p指针

9、所指向的变量在q指针所指向的变量之前。否则,表示p指针所指向的变量在q指针所指向的变量之后,或指向同一个变量。,10.2.4 指针变量作为函数参数 函数的形参要求是可以接收地址值的指针变量,函数调用时,对应的实参可以是变量的地址或指向变量的指针变量。与其他类型的参数一样,函数调用时实参与形参之间依然遵循单向值传递规则,但此时传递的内容是地址值。,例10.3 利用指针变量作函数参数实现两个变量值的交换。 void swap(p1,p2) int *p1,*p2; int temp; temp=*p1; *p1=*p2; *p2=temp; main() int a,b,*pa,*pb; pa=

10、程序运行结果为: 58,79 a=58,b=79 a=79,b=58,图10.8 指向变量的指针变量作函数参数,10.3 数组的指针,数组是一组相同类型数据的集合,数组中各个元素在内存占据连续的存储单元,每个内存单元都有相应的地址。数组所占内存单元的首地址称为数组的指针,数组元素所占内存单元的首地址称为数组元素的指针。因此,可以用指针变量来指向数组或数组元素。用于存放数组的指针或某一数组元素指针的指针变量称为指向数组的指针变量。C语言规定,数组名代表数组的首地址,因此,数组名实际上也是指针,但它是一个固定不变的指针常量。,10.3.1 一维数组的指针,1指向数组的指针变量的定义 指向数组的指针

11、变量与一般指针变量的定义方法相同。 例如: int a10; p=a; 定义了整型数组a,又定义了指针变量p,通过赋值语句p=a将数组a的首地址赋给指针变量p,p指向了a数组,如图10.9所示。指针变量p就称为指向数组a的指针变量。也可以将数组中下标为0的数组元素的地址赋给指针变量。,图10.9 数组和指针的关系,2利用指针访问数组的几种方法 指针变量指向数组后,就在指针和数组之间建立了联系。假设,指针变量p经上述定义并指向数组a后,就可以通过指针运算使指针指向数组的各个元素,从而实现对数组元素的访问。,综上所述,引用数组中第i个元素的方法有以下4种方法。 (1)通过下标方式引用数组元素,如a

12、i。 (2)通过数组名引用数组元素,如*(a+i)。 (3)通过指针变量引用数组元素,如*(p+i)。 (4)指针下标法引用数组元素,如pi。,例10.5 用不同的方法输出数组中的元素。 main() int a5,i,*pa; /*定义数组a,循环变量i,指向数组的指针变量p*/ printf(“please input number:n“); for(i=0;i5;i+) /*输入5个数*/ scanf(“d“,for(i=0;i5;i+) printf(“*(a +d)=d “,i,*(a+i); /*通过数组名a输出数组元素*/ printf(“n“); for(i=0;i5;i+)

13、printf(“*(p+d)=d “,i,*(p+i); /*通过指针变量p输出数组元素*/ printf(“n“); for(i=0;i5;i+) printf(“pd=d “i,pi); /*利用下标法输出数组元素*/ printf(“n“); ,程序运行结果为: please input number: 0 1 2 3 4 a0=0 a1=1 a2=2 a3=3 a4=4 *(a+0)=0 *(a+1)=1 *(a+2)=2 *(a+3)=3 *(a+4)=4 *(p+0)=0 *(p+1)=1 *(p+2)=2 *(p+3)=3 *(p+4)=4 p0=0 p1=1 p2=2 p3=3

14、 p4=4,分析:要实现数组元素的逆序存放,只需按照图10.10所示,将相应的数组元素互换即可。,图10.10 逆序存放数组中元素,例10.7 将数组中的10个数逆序存放。,main( ) int a10,*p,*head,*end,temp; printf(“please input 10 numbers:n“); for(p=a;p=a+9;p+) scanf(“d“,p); printf(“The original array:n“); for(p=a;p=a+9;p+) printf(“d “,*p); head=a; end=a+9;,while(headend) temp=*hea

15、d; *head=*end; *end=temp; head+; end-; printf(“The array has been inverted:n“); for(p=a;p=a+9;p+) printf(“d “,*p); ,程序运行结果为: please input 10 numbers: 1 2 3 4 5 6 7 8 9 10 The original array: 1 2 3 4 5 6 7 8 9 10 The array has been inverted: 10 9 8 7 6 5 4 3 2 1,10.3.2 数组名作为函数参数和指针变量作为函数参数的一致性 在前面的学习

16、中,当数组名作函数参数时,要求对应的形参、实参必须是相同类型的数组。函数调用时并不是将整个实参数组的所有元素拷贝成副本传递给被调用函数,而只是将实参数组的首地址传递给形参数组,于是这两个数组将共同占用同一段内存空间。数组名作函数参数,实现的是地址传递调用。数组名代表的是数组的首地址,即数组的指针,它作函数参数,实际上就是指针作函数参数。所以指向数组的指针变量作函数参数,同数组名作函数参数一样,都可以实现函数参数间的地址传递调用。,例10.8 输入10个数,将最小数与第一个元素交换,最大数与最后一个元素交换。 void max_min(int *array,int n) int *max,*min, *p,*arr_end,temp; arr_end=array+n1; m

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

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

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