C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针

上传人:E**** 文档编号:89494488 上传时间:2019-05-25 格式:PPTX 页数:33 大小:240.21KB
返回 下载 相关 举报
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针_第1页
第1页 / 共33页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针_第2页
第2页 / 共33页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针_第3页
第3页 / 共33页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针_第4页
第4页 / 共33页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第8章 指针(33页珍藏版)》请在金锄头文库上搜索。

1、第 8 章 指 针,学习目标,掌握定义指针的方法,掌握指针的 基本操作; 掌握利用指针作为函数参数传递数据的方法; 掌握一维数组指针和行指针的概念和应用,主要内容,指针的概念 指针变量的定义 指针的基本操作 指针变量的简单应用 指针作为函数参数 一维数组的指针 行指针,8.1 指针的概念和简单应用 一. 指针和指针变量的概念 变量名就是给变量数据存储区域所取的名字。计算机内 存的每个存储位置都对应有唯一的存储地址。C语言支持通 过变量存储地址对变量进行存取操作。 1. 取地址运算符“&” 通过对变量施行取地址运算,获得变量的存储地址。在C语言中,称变量的存储地址为指针。,【例8-1】 下面的程

2、序显示变量x的存储地址和x的值。 main() int x=3; printf(“Address of x is %xH, Value of x is %dn“, ,先显示变量x的存储地址, 然后显示 变量x的值。地址以十六进制格式输出。,如果程序运行结果显示:,Address of x is ffdcH, Value of x is 3 说明变量x的指针为ffdc, 即变量x存储在起始地址为ffdcH 的内存单元中。如图所示: ffdcH 3 ffddH 0 空指针的概念 一个不指向任何存储单元的指针称之为空指针,空指针的值为ASC码表中的NULL值,也即是0值 。,2. 指针变量 专门用来

3、表示变量的存储地址的一类变量,称之为指针变量。 定义指针变量的格式: 类型说明符 *指针变量名;,定义指针变量的例子: 例1. float x,y,*pf; /* 定义浮点型变量x、y及一个指向浮点型数据 的指针变量pf */ 例2.char ch1,ch2; /* 先定义字符型变量ch1,ch2 */ char *p1; /* 再定义一个指向字符型数据的指针变量 p1 */ 例3. char ch,*pc= /* 定义整型变量a, 并初始化等於7,又定义一个 指向整型数据的指针变量p, 同时使p指向a的存 储单元 */,注意: (1).类型说明符说明的是指针变量所指向的数据类型。不同 类型的

4、指针变量不能相互替代。 (2).指针变量具有与其他变量相同的命名规则。 (3).指针变量的初始化要遵循“先说明、后使用”的原则。,二.指针变量的简单应用 1. 给指针变量赋值 在程序中通过赋值语句给指针变量赋值。 例如: int a,*p; /* 定义整型变量a,又定义一个指向整 型数据的指针变量p */ p= /* 使指针变量p指向a的存储单元 */,2. 取得指针变量所指向的变量值 在程序中 “*指针变量名” 表示取得其所指向的变量的值。 例如: int a=7,b=5,c,*p1= /* 取出a, b的值,相加后将结果赋 给变量c,等价于 c=a+b */,【例8-2】 输入三个整数,

5、输出其中的最大值。 main() int x,y,z,*p1= ,交换指针 指向,【例8-3】 输入三个整数, 按从大到小的顺序输出这三个数。,main() int a,b,c,*p1= ,if(*p2*p3) t=p3; p3=p2; p2=t; if(*p1*p2) t=p2; p2=p1; p1=t; printf(“%d,%d,%d“,*p1, *p2,*p3); ,交换指针 指向,8.2 指针作为函数参数,指针可以作为函数的形参和实参参与函数调用。在函数调用 时,通过地址传递,把实参变量的存储地址传递给形参变量, 被调函数通过这些存储地址访问实参变量,使实参变量参与函 数调用。 指针

6、变量要作为函数参数,必须满足:在函数调用中,形式 参数和实在参数在类型,个数和顺序上必须保持一致的要求: 在函数调用时,如果实在参数是指针,那么函数中 相应的形式参数必须被说明为同类型的指针变量。,【例8-4】 通过函数调用交换实参变量的值。 void swap(int *x,int *y) int temp; temp=*x; *x*y; *ytemp; main() int a,b; printf(“Please input two integers:n“); scanf(“%d,%d“, ,形式参数为 指针变量,实在参数为 指针,【例8-5】从键盘输入三个整数,通过函数调用,同时返回这

7、三个整数的和与积。 void f(int,int,int,int *,int *); main() int a,b,c,sum,mul; printf(“Please Input Three Integers:n“); scanf(“%d,%d,%d“, ,8.3 指针和数组 一.一维数组的指针及其应用 1. 一维数组指针的概念 在C语言中,一维数组的数组名表示数组存放的首地址,称 其为数组的指针。显然,该指针与数组首元素的指针有相同 的值。,定义一维数组 int arr5= 5,4,3,2,1;并假定数组在内存中 从2000H开始存放。,则:数组名arr就是数组arr的指 针,arr的值为数

8、组的存储地址 2000H。显然,数组元素arr0的指 针也是2000H,数组元素arr1的指 针是2002H,。在C程序中,执行语句: printf(“%x“,arr); 即可输出一维数组arr的指针。,一维数组指针和数组元素指针的关系 数组名i 指向数组第i个元素 例如: arr是数组arr的指针,则 arr+i 指向数组arr的第i个元素,即: arr+i &arri,【例8-6】 从键盘输入十个整数, 然后逆序输出。 main( ) int a10,i,*p; printf(“Please input ten Integers:“); for(i=0;i=a;p-) printf(“%d

9、, “,*p); printf(“n“); ,注意: (1).指针变量可以施行自加、自减运算,p+或+p使指针变 量指向数组当前元素的下一个元素,而p-或-p使指针变量 指向数组当前元素的前一个元素。 (2).数组名a是数组的首地址,是一个常量,所以不可以施行 自加、自减运算。 (3).如果指针变量p指向数组的某一个元素ai,则*p+表示 读取ai的值后,再使p指向ai+1。可以类似地理解*p-。 (4).如果指针变量p指向数组的某一个元素ai,则-*p表示 先使p指向ai-1,再读取ai-1的值。可以类似地理解+*p。 (5). 如果指针变量p指向数组的某一个元素ai,则(*p)+ 表示读取

10、ai的值后,执行ai+=1,而p的指向不变。可以 类似地理解(*p)-。 (6). *p+和*(p+)、*p-和*(p-)的运算结果是一样的。,【例8-7】从键盘输入5个数,输出其中的最大值和最小值。,int max,min; void f(int *arr,int n) int *p,*arr_end; arr_end=arr+n; max=min=*arr; for(p=arr+1;pmax) max=*p; else if(*pmin) min=*p; ,main() int i,a5,*p1=a; printf(“Please Input Five Integers:n“); for(

11、;p1a+5;p1+) scanf(“%d“,p1); p1=a; f(p1,5); printf(“max=%d, min=%dn“, max,min); ,形式参数为 指针变量,实在参数为 指针,数组名就是 数组的指针,二. 二维数组的指针 1. 行指针的概念 二维数组的数组名表示数组存储的首地址。 例如,定义二维数组: int a34=2,4,6,8,10, 12,14,16,18,28,22,24; 设数组a存储在从2000H开始的存储单元中。,数组名a指向数组存储的首地址2000H。但a+1不是指向a01 的存储单元,而是指向二维数组第1行的存储首地址2008H,a+2 指向二维数组

12、第2行的存储首地址2010H . 。确切地说,数组 名a指向二维数组第0行的存储首地址2000H。,注意:,称二维数组各行的存储首地址为该行的行指针,是以二维 数组的行为存储单位的地址。 二维数组的行指针和数组元素指针的关系 *(数组名i)j 指向二维数组第i行、第j列的元素 而*(*(数组名i)+j)即是取出第i行、第j列的元素值。 例如: a是二维数组a的行指针,则 *(a+i)+j 指向数组a的第i行、第j列的元素,即: *(a+i)+j 其中:(*p)表示p是行指针变量, 4表示该行指针变量指向的 行有4个列元素, int表示二维数组的元素为整型变量。,【例8-8】以二种不同的方式输出

13、数组元素aij 的存储单元 地址和值。 main() int a22=2,4,6,8,i,j; int (*p)2=a; for(i=0;i=1;i+) for(j=0;j=1;j+) printf(“Address1 of a%d%d is %x“, i,j,*(p+i)+j); printf(“ a%d%d=%dn“,i,j, *(*(p+i)+j); printf(“Address2 of a%d%d is %x“, i,j,*(a+i)+j); printf(“ a%d%d=%dn“,i,j, *(*(a+i)+j); ,用二维数组a的数组名a 对行指针变量p作初始化,行指针的方法输出

14、数组 元素aij 的指针和值,用二维数组名的方法输出 数组元素aij 的指针和值,【例8-9】 用行指针的方法计算并输出二维数组a各行 元素的和。 main() int a34= 2,4,6,8,10,12,14,16, 18,20,22,24; int (*p)4=a,i=0,j; for(p=a;p=a+2;p+,i+) int sum=0; for(j=0;j=3;j+) sum+=*(*p+j); printf(“Sum of Row %d is %dn“,i,sum); ,【例8-10】 用访问一维数组的方法输出二维数组所有元素的和。 main() int a34=2,4,6,8,1

15、0,12,14,16, 18,20,22,24; int i,j,sum=0,*p= ,用二维数组a元素a00 的地址对指针变量p作初始化 ,p1指向a01,【例8-13】 通过函数调用求二行四列矩阵的最大元素值。 int max(int (*p)4) int i,j,m; m=*p; for(i=0;im) m=*(*(p+i)+j); return(m); main() int a24,i,j; printf(“Please Input Eight Integers:n“); for(i=0;i=1;i+) for(j=0;j=3;j+) scanf(“%d“, ,形参为行 指针变量,即:*(*(p+0)+0),实参为二维数组的 数组名,8.4字符串的指针及其应用 字符串的指针就是字符串在内存存储区域中的起始地址, 存放该字符串的字符数组名就是其指针。 例如:定义一字符串:char s=“I love China. “; 那么,字符数组名s就是该字符串的指针。通过指针变量,既可 以访问整个字符串,也可以访问字符串中的某个字符。,【例8-14】 通

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

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

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