C语言教程课件Ch10指针_第1页
C语言教程课件Ch10指针_第2页
C语言教程课件Ch10指针_第3页
C语言教程课件Ch10指针_第4页
C语言教程课件Ch10指针_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、第十章,指 针,本章主要内容,指针和地址的概念 指针变量指向数组/字符串时的操作 指针变量做函数参数 几种指针类型 返回指针值的函数,重点、难点,如何理解指针和地址的概念 灵活使用指向一位数组/字符串的指针 灵活使用指针变量/数组名做函数参数 掌握几种指针的概念 与函数一章的例题结合,掌握参数单向传递的实质,10.1 指针的概念 10.2 变量的指针和指向变量的指针变量 10.3 数组的指针和指向数组的指针变量 10.4 字符串的指针和指向字符串的指针变量 10.5 函数的指针和指向函数的指针变量 10.6 返回指针的函数 10.7 指针数组和指向指针的指针 10.8 有关指针的数据类型和指针

2、运算的小结,1地址的概念 程序中每一个变量在编译或运行时系统都为其分配内存单元,每一个内存单元(字节)都有一个相应的编号,这个编号称为该内存单元的“地址”,而内存单元中存入的内容则是该变量的值。,3,6,9,2000,3010,变量 i_pt,10.1 指针的概念,int i=3, j=6, k=9;,int *i_pt;,i_pt=,指针是c语言中比较灵活的数据结构,灵活地运用指针可以: (1) 有效地表示复杂的数据结构. (2) 动态分配内存. (3) 更方便地使用字符串和数组. (4) 直接处理内存地址.,2对内存单元的存取有两种方式 (1)直接访问 按变量地址存取变量的值。 (2)间接

3、访问 将变量i的地址存放在另一个内存单元j中,要访问i, 则先按j的地址取出i的地址,再按i的地址取出i的值。,直接访问和间接访问示意图,3指针变量的概念 一个变量的地址称为该变量的“指针”。 如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”。指针变量的值是指针。,一、指针变量的定义 指针变量必须在使用之前先定义,它是用来存放地址的。必须将它定义为“指针类型”。 定义的一般形式为: 类型标识符 *标识符,注: (1) 标识符前面的“*”,表示该变量为指针变量。但指针变 量名是pt_1、pt_2、pt_3,而不是*pt_1、*pt_2、*pt_3。 (2) * 表示指向

4、, 故*pt_1,*pt_2, *pt_3表示指针变量 pt_1, pt_2, pt_3所指向的变量。 (3) 一个指针变量只能指向同一个类型的变量。,10.2 变量的指针和指向变量的指针变量,例: int *pt_1 ; char *pt_2 ; float *pt_3 ;,二、指针变量的引用,有两个有关的运算符 (1) c=*pt+; b与c值是否相等?,void main( ) int a,b,*p1,*p2; a=100; b=10; p1= ,例:1,*p1, scanf(%d %d, ,输入: 5 9,*p1, scanf(%d %d, , int *point_1,*point_

5、2; scanf(%d%d, ,输入数据: 4 8,输出结果: 8 , 4 8 , 4,void swap(int *p1,int *p2) int p; p=*p1;*p1=*p2; *p2=p;, p=p1;p1=p2; p2=p;,void main ( ) int a,b; int *point_1,*point_2; scanf(%d%d, printf(n%d,%dn,*point_1,*point_2); ,输入数据: 4 8,4,8,p1,p2,point_1,point_2,输出结果: 4,8 4,8,注:1.不能企图通过改变形参地址而使实参地址也改变, 也就是说调用函数不能

6、改变实参指针变量的值。 2.调用函数可以改变实参指针变量所指变量的值。,例2:输入a,b,c 三个整数,按大小顺序输出。,void swap(int *pt1,int *pt2) int *pt1,*pt2; int p; p=*pt1; *pt1=*pt2; *pt2=p; ,void exchange(q1,q2,q3) int *q1,*q2,*q3; if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3); ,void main() int a,b,c,*p1,*p2,*p3; scanf(%d%d%

7、d, ,q1,q2,q3,pt1,pt2,10,5,q1,q2,q3,10.3 数组的指针和指向数组的指针变量,数组的指针是指数组的起始地址,数组元素的指针 是数组元素 的地址。,指针法: main( ) int *p,i,a10; p= ,p,例1:输出数组全部元素。(设a数组,整型,10个元素),3,p,5,p,p,-4,p,12,p,p,*(p+i);,p+i);,p=a;,p=a;,(2)下标法 main ( ) int a10; int i; for (i=0;i10;i+) scanf(%d, ,(3)地址法 main ( ) int a10; int i; for (i=0;i1

8、0;i+) scanf(%d,a+i); printf(n); for (i=0;i10;i+) printf(%3d,*(a+i); ,在使用指针变量时应注意的几个问题: 1. 数组名是数组的首地址,因此 p= for (i=0;im;i+) j=n-1- i; t=xi; xi=xj; xj=t; ,void main ( ) int i ,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for (i=0;i10;i+); printf(%3d,ai); printf(n); inv(a,10); printf(The arr

9、ay has been inverted:n); for (i=0;i10;i+) printf(%3d,ai); printf(n); ,void inv(int *x, int n) int t,*i,*j; j=x+n-1; for (i=x;ij;i+,j-) t=*i; *i=*j; *j=t; ,若将形参改为指针,则inv函数可改为:,j,i,i,j,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下几类情况: (1) 形参和实参都用数组名 传递的是实参数组首地址,形参与实参共用同一段内存单元。 (2) 实参用数组名,形参用指针变量 通过指针变量值的改变

10、可以指向实参数组的任一元素。 (3) 实参和形参都用指针变量 先使实参指针变量指向数组的首地址,然后将实参的值 传给形参,通过指针变量值的改变可以使其指向数组的每个元素。 (4) 实参为指针变量,形参为数组名 设p为指针变量,令p= for (i=0;ixk) k=j; if (k!=i) t=xi;xi=xk;xk=t; ,void main ( ) int *p,i,a10; p=a; for (i=0;i10;i+) scanf(%d,p+); p=a; sort(p,10); for (p=a,i=0;i10;i+) printf(%d,*p+); ,(1) 实参用指针变量,形参用数组

11、名,(2) 实参用数组名,形参用指针变量,void sort(int *x,int n) int i,j,k,t; for (i=0;i*(x+k) k=j; if (k!=i) t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; ,void main ( ) int i,a10; for (i=0;i10;i+) scanf(%d, ,(3) 实参用指针变量,形参也用指针变量,void main ( ) int *p,i,a10; p=a; for (i=0;i10;i+) scanf(%d,p+); p=a; sort(p,10); for (p=a,i=0;i10;i+

12、) printf(%d,*p+); ,void sort(int *x,int n) int i,j,k,t; for (i=0;i*(x+k) k=j; if (k!=i) t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; ,例4:从10个数中找出其中最大值和最小值。,int max,min; void main ( ) int i,number10; void max_min_value( ); printf(enter 10 datan); for (i=0;i10;i+) scanf(%d, ,方法1:,外部变量,void max_min_value(int arr

13、ay , int n) int *p,*array_end; array_end=array+n; max=min=*array; for (p=array+1;pmax) max=*p; else if (*pmin) min=*p; ,2 32 -12 4 56 7 28 -67 39 41,array,array_end,p,32,p,-12,p,p,56,p,p,p,-67,p,p,p,*array,void main( ) int i,number10; int amax,amin,*amax_p,*amin_p; void max_min_value( ) ; printf(ent

14、er 10 datan); for (i=0;i10;i+) scanf(%d, ,方法2:,12 -23 5 78 27 6 9 36 3 4,12,12,void max_min_value(int array,int n,int *a1,int *b1) int i; for (i=1;i*a1) *a1=arrayi; else if (arrayi*b1) *b1=arrayi; ,12 -23 5 78 27 6 9 36 3 4,12,12,max_min_value(number,10,amax_p,amin_p);,array,10,n,a1,b1,三、指向多维数组的指针和指

15、针变量,int a34= 6,9,0,16,8,-1,2,7,3,48,-5,12;,(1) a+i=ai=*(a+i) a=a0=*(a+0)=*a= printf (FORMAT,a,*a); printf (FORMAT,a0,*(a+0); printf (FORMAT, ,运行结果: 158,158 158,158 158,158 166,166 166,166 174,174 174,174 9, 9,2多维数组的指针 可以用指针变量指向多维数组及其元素 (1) 指向数组元素的指针变量。,例5:用指针变量输出数组元素的值。,void main( ) static int a23=2

16、,3,6,7,8,5; int i,j,*p; p= ,2 3 6,7 8 5,a,a0,a1,p,2,3,2 3 6,p,p,6,p,7,p,8,p,5,p,例6:用指针变量输出数组元素aij的值。,void main( ) static int a23=2,3,6,7,8,5; int i,j,*p; p=a; scanf(%d %d, ,void main() static int a45=1,4,2,3,7,6,9,10,8,-1, -2,-6,-4,4,2,7,6,9,11,14; int i,j; for(i=0;i4;i+) for(j=0;j5;j+) printf(%4d,a

17、ij); printf(n); sort(a,4*5); printf(=n); for(i=0;i4;i+) for(j=0;j5;j+) printf(%4d,aij); printf(n); ,例7: 将一个二维数组a45进行按行全排序,void sort(int *p,int n) int i,j,t; for(i=0;in-1;i+) for(j=i+1;j=n-1;j+) if(*(p+i)*(p+j) t=*(p+i); *(p+i)=*(p+j); *(p+j)=t; ,sort(a,4*5);,p,(2) 指向由m个整数组成的一维数组的指针变量。,例7:输出二维数组任一行任一

18、列的元素的值。 void main ( ) static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j; p=a; scanf(i=%d,j=%d, ,说明: (1) int (*p)4 表示p指向一个包含4个元素的一维数组. (2) p+1使指针移动2*4个字节, *(p+1)使指针的指向由横 向转向纵向. (3) *(p+i)+j使指针移动2*4*i+2*j.,(3) 多维数组的指针作函数参数。,例9: 求二维数组a45每列最大值,void colum_max(a,b) int (*a)5,*b; int i,j; for(j=0;j5;j+) for(i=1;i4;i+) if (*(b+j)*(*(a+i)+j) *(b+j)=*(*(a+i)+j); ,int a45,b5;,colum_max(a,b);,.,3,4,12,33,27,5,15,void main( ) int a45,b5; int i,j; for(i=0;i4;i+) for(j=0;j5;j+) scanf(%d, ,打印原二维数组,打印每列最大值,例8:有一个班,30个学生,各学4门课,计算总平均分 以及第n个学生的成绩。,void average(float *p,int

温馨提示

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

最新文档

评论

0/150

提交评论