高级语言程序设计教学课件第8章_第1页
高级语言程序设计教学课件第8章_第2页
高级语言程序设计教学课件第8章_第3页
高级语言程序设计教学课件第8章_第4页
高级语言程序设计教学课件第8章_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 指针,2,学习目标,理解内存单元的双重属性 指针的使用 指针与数组的关系 指针与函数的关系,3,8.1指针概述,变量与地址,程序中:int x; int * p; x = 5;,内存中每个字节有一个编号地址,x,p,编译或函数调用时为其分配内存单元,5,5,4,直接访问与间接访问 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量,程序中:int x; int * p; x = 5; p = ,5,p,编译或函数调用时为其分配内存单元,3000,直接访问,间接访问,30,5,6,7,直接访问是用简单变量来访问内存单元的地址 间接访问是通过存放简单变量地址(指针)

2、的变量去访问内存单元的地址,结论,8,程序中:int x; int * p; x = 5; p = ,3000,30,9,-9-,main() int a,*p; a=10; p= ,运行结果: a:10 p:ffcc,例,10,为什么引入指针的概念,指针的主要应用: 指针作形参可以在子函数中修改实参变量的值 利用指针作形参可以使子函数有多于一个的返回值 利用指针可以实现动态分配内存 利用指针可以实现动态数据结构(链表、队列、堆栈、树等)的操作 指针可以改善某些函数的效率,11,【例8-1】编写一个的子程序,子程序的功能为交换两个变量的值,#include stdio.h void swap(

3、int x, int y); void main(void) int a, b; printf(请输入交换的数值:); scanf(%d%d, ,3,5,调用前,调用时,调用结束,12,参数传递方式,单向值传递 形参是变量,实参可以是常量、变量或表达式。 形参与实参占用不同的内存单元。 单向值传递(形参的改变并不影响实参)。 地址传递 形式参数为指针变量,实际参数为变量的地址。 形参指向实参。,13,【例8-1】编写一个的子程序,子程序的功能为交换两个变量的值(改进),#include void swap(int *x, int *y); void main() int a, b; scanf

4、(%d%d, ,14,void swap(int *x, int *y) int t; printf(n-swap-n); printf(x=%x,y=%xn, x, y); t = *x; *x = *y; *y = t; printf(-swap-nn); ,15,13ff76,内存,13ff78,13ff7a,13ff7c,3 5 void main() int a, b; scanf(%d%d, ,16,说明,在该例题中,我们利用指针作形参实现了修改实参变量的值。,17,8.2 指针基础,指针变量的说明 数据类型 * 指针变量名;,18,注 意,int *p1, *p2; 与 int

5、*p1, p2; 指针变量只能指向定义时所规定类型的变量 不能将一个常数值赋给指针变量;但可以将NULL或者0赋值给指针变量 指针变量定义后,变量值不确定,使用前必须先赋值,int *p1, *p2, *p; float *q; q=p; p= 3000; p= 0;, ,19,指针运算符,例: int a, *pt; pt=,20,指针变量的初始化 一般形式 数据类型 * 指针名 = 初始地址值;,例int i; int *p = ,21,例 main( ) int i=10; int *p; *p = 20; printf(“%d”, *p); ,例 main( ) int i=10; i

6、nt *p; p = ,指针变量必须先赋值,再使用,危险!,*p,22,-22-,main( ) int x , *px; px= void main() float a, b, c, t1, t2; int flag; printf(Input parameters a,b,c:n); scanf(%f,%f,%f, ,25,flag = solvroot(a, b, c, ,26,int solvroot(float a, float b, float c, float *r1, float *r2) float delta; *r1 = -b/(2*a); delta = b*b-4*a

7、*c; if (delta = 0) *r2 = sqrt(delta)/(2*a); else *r2 = sqrt(-delta)/(2*a); return (int)delta; ,27,说明,在该例题中,我们利用指针作形参实现了子函数有三个的返回值。子函数通过返回值返回(int) delta的值,通过形参 *r1、*r2与实参 void main() int a, b, *p; scanf(%d%d, ,30,int * larger (int *x, int *y) if ( *x*y ) return x; else return y; ,31,8.5 指针与一维数组,一、指向数

8、组元素的指针 数组元素是内存的一个单元,故指向数组元素的指针变量的性质和指向变量的指针变量是一样的 数组名是指针(地址)常量 例如: int a10, *p; p = ,a,32,二、通过指针引用数组元素 指针的运算 指针变量的赋值运算 p=,int i, a, *p, *p1; int array10;,(将变量a地址p) (将数组array首地址p) (将数组元素地址p) (指针变量p值p1),33,指针的算术运算 pi 表示的p向前或向后移动i个元素(i为整型数) p+, p-, p+=i, p-=i等 若p1与p2指向同一数组,p1-p2=两指针间元素个数 p1+p2无意义,例 p指向

9、int型数组,且p= 则p+1 指向?,例 int a10; int *p=,例 int a10; int *p1=,当p指向数组中的元素时,算术运算才有意义,34,指针的关系运算 若p1和p2指向同一数组,则 p1p2 表示p1指的元素在后 p1=p2 表示p1与p2指向同一元素 若p1与p2不指向同一数组,比较无意义,当p1、p2指向数组中的元素时,关系运算才有意义,35,数组元素表示方法,int a10, * p = a;则我们要使用数组中第i个元素,可以用如下的方法表示:,下标法:ai, pi 指针法:如*(a+i), *(p+i),36,-36-,ai *(a+i) pi *(p+i

10、),数组元素表示法,数组元素地址表示法, i; for (i=0;i10;i+) scanf(%d, ,数组名计算地址法 main ( ) int a10;i; for (i=0; i10; i+) scanf(%d, a+i); for (i=0; i10; i+) printf (%d,*(a+i) ); ,例:输入输出整型数组a的全部元素。(假有10个元素),指针法 main( ) int a10, i, *p ; p= ,38,-38-,int a=1,2,3,4,5,6,7,8,9,10,*p=a,i; 数组元素地址的正确表示:(A) p=a; for(i=0; i10; i+) s

11、canf(%d, p); p+; for(i=0; i10; i+) printf(%d, *(p+i); ,p=a;,例:注意指针的当前值,10,9,8,7,6,5,4,3,2,1,1 2 3 4 5 6 7 8 9 10 ,-36 285 1 38 22 34 0 14914 124 9,40,1.数组名是数组的首地址,p= int y, *p = ,输出:5 6,6,指针变量的复杂运算,42,【例】写一个函数,将包含n个元素的数组进行排序,void main() /*冒泡*/ int n=10, a10=3,2,4,5,6,8,9,25,21,10 ; int i, j, temp; f

12、or(i=0; iaj+1) temp = aj; aj = aj+1; aj+1 = temp; ,void sort(int a, int n),aj *(a+j),void sort(int * a, int n),if(*(a+j)*(a+j+1) temp = *(a+j); *(a+j) = *(a+j+1); *(a+j+1) = temp;,43,int *p 与 int a10 p 是指针变量数组名a 是指针(地址)常量 若p=a,则p+i是ai的地址(即p+i=,a2,a1,a0,提出问题:a和a0一样吗?a+1和a0+1一样吗?,a,每个元素ai是由包含4个元素的一维数组

13、组成,把二维数组a理解成由3个元素组成的一维数组,45,【例8-6】读以下程序,分析运行结果,理解二维数组指针的概念,#include void main() int a22=1, 2, 3, 4; int i;,45,46,for (i=0; i2; i+) printf(a+%d = %x, i, a+i); printf(t *(a+%d)= %x, i, *(a+i); printf(t a%d= %x, i, ai); printf(t *(*(a+%d)= %dn, i, *(*(a+i); for (i=0; i2; i+) printf(a0+%d= %x, i, a0+i);

14、 printf(t *(a0+%d)= %dn, i, *(a0+i); ,a+0 = 13ff70 *(a+0)= 13ff70 a0= 13ff70 *(*(a+0)= 1 a+1 = 13ff78 *(a+1)= 13ff78 a1= 13ff78 *(*(a+1)= 3 a0+0= 13ff70 *(a0+0)= 1 a0+1= 13ff74 *(a0+1)= 2,47,对于二维数组a22,指针常量a和a0是不同类型的指针。通过运行结果我们可以看到: 数组名a是指针常量,a的比例因子为1行指向二维数组的第0行; a0也是指针常量,比例因子为1个元素指向二维数组第0行第0个元素,47,*

15、(a+0)和*(a+1) *(*(a+0)和*(*(a+1) *(a0+0)和*(a0+1) a0+2指向谁呢? a11有多少表示法呢? *(a0+3)、*(a1+1) *(*(a+1)+1),例 int a22;,a0,a,48,例:求二维数组a34所有元素的和以及平均值。,main( ) int a34=1,2,3,4,5,6, 7,8,9,10,11,12; int i, sum=0,*p ; p= printf(“sum=%d,aver=%f”, sum,sum/12.0) ,49,8.6 指针与数组编程实例,【例8-7】数列的中位数是数列中按照数值大小排在中间位置的数。例如:数列1,

16、2,3,4,5的中位数为3。 算法:先对数列排序,然后寻找排序序列的中位数。,49,50,#include void sort(int a, int n); void main() int ser100; int i, num; printf(Input length of serial:n); scanf(%d, ,51,void sort(int a, int n) int i, temp; int *p; for(i=0; i *(p+1) temp=*p; *p=*(p+1); *(p+1)=temp; ,51,Input length of serial: 5 input seria

17、l elements: 1 -3 23 67 15 The median of serial is 23,52,例 编写函数求出二维整型数组中元素的最大值及其下标号,#include #define M 3 #define N 2 int maxarray(int aMN, int m, int n, int *pmaxi, int *pmaxj); void main() int aMN=1,2,3,4,5,6; int max, maxi, maxj; max = maxarray(a, M, N, ,53,int maxarray(int aMN, int m, int n, int *

18、pmaxi, int *pmaxj) int i, j, max = a00; for(i=0; im; i+) for(j=0; jn; j+) if(maxaij) max = aij; *pmaxi = i; *pmaxj = j; return max; ,54,8.7 指针与字符串,字符串表示形式 用字符数组实现,main( ) char string=“I love China!”; printf(“%sn”,string); printf(“%sn”,string+7); ,I love China!,China!,55,main( ) char *cp=“I love Chin

19、a!”; printf(“%sn”, *cp); printf(“%sn”, cp); cp+=7; printf(“%sn”, cp); ,用字符指针实现,I I love China! China!,字符指针初始化:把字符串首地址赋给cp char * cp; cp=“I love China!”;,56,char string20= “I love China!”;,char *cp= “I love China!”;,aa00,57,字符型指针变量与字符数组 char str20; 与 char *cp; str由若干元素组成,每个元素放一个字符cp只是一个指针变量,存放字符串首地址

20、char str20; str=“I love China!”; char *cp; cp=“I love China!”; str是地址常量;cp是地址变量 cp接受键入字符串时,必须先开辟存储空间,例 char str10; scanf(“%s”,str); () 而 char *cp; scanf(“%s”, cp); (),改为:char *cp, str10; cp=str; scanf(“%s”,cp); (),58,char str=“Hello!”; char str=“Hello!”; char str=H,e,l,l,o,!; char *cp=“Hello”; int a

21、=1,2,3,4,5; int *p=1,2,3,4,5; char str10, *cp; int a10, *p; str = “Hello”; cp = “Hello!”; a = 1,2,3,4,5; p = 1,2,3,4,5;, , ,分析下列用法正确与否,59,【例8-8】编写出程序读入矩阵元素,并且利用指针遍历矩阵所有元素,要求输出矩阵和矩阵元素的最大值,#include #include void main() int a1010; int *p; int num, max, i; printf(Input element of column:n); scanf(%d, ,5

22、9,60,if (num10) printf(Wrong number!n); exit(0); printf(Input element of matrix:n); for (i=0; inum; i+) for (p=ai; p= ,61,max = a00; for (i=0; inum; i+) for (p=ai; p= ,61,62,【例8-9】写程序,判断一个单词是否为回文。回文指的是单词按从前到后与从后到前的顺序读都相同,例如“level”就是是一个回文单词。,#include #include #define MAXLEN 80 void main() char *str;

23、int flag; int pal(char *); if (str = (char *) malloc(MAXLEN) ) = NULL) printf(Memory allocation error!n); exit(0); ,63,printf(Input a word:n); scanf(%s, str); while (*str != #) flag = pal(str); if (flag) printf(%s is a palindrome!n, str); else printf(%s isnt a palindrome!n, str); printf(Input a word:n); scanf(%s, str); free(str); ,64,int pal(char * str) /*判断回文*/ char *p, *q; p = str; q = str; while (*q != 0) /*p指向首部,q指向尾部*/ q+; q-; while (p = q); ,65,C语言字符串操作的库函数,1字符串连接函数strcat,char * strcat(char *s1, char *s2) char *p, *q; p = s1; q = s2; while

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论