![[理学]第8章指针.ppt_第1页](http://file.renrendoc.com/FileRoot1/2018-12/25/fecd6977-d697-4b8e-ae90-9f61a0f3e90f/fecd6977-d697-4b8e-ae90-9f61a0f3e90f1.gif)
![[理学]第8章指针.ppt_第2页](http://file.renrendoc.com/FileRoot1/2018-12/25/fecd6977-d697-4b8e-ae90-9f61a0f3e90f/fecd6977-d697-4b8e-ae90-9f61a0f3e90f2.gif)
![[理学]第8章指针.ppt_第3页](http://file.renrendoc.com/FileRoot1/2018-12/25/fecd6977-d697-4b8e-ae90-9f61a0f3e90f/fecd6977-d697-4b8e-ae90-9f61a0f3e90f3.gif)
![[理学]第8章指针.ppt_第4页](http://file.renrendoc.com/FileRoot1/2018-12/25/fecd6977-d697-4b8e-ae90-9f61a0f3e90f/fecd6977-d697-4b8e-ae90-9f61a0f3e90f4.gif)
![[理学]第8章指针.ppt_第5页](http://file.renrendoc.com/FileRoot1/2018-12/25/fecd6977-d697-4b8e-ae90-9f61a0f3e90f/fecd6977-d697-4b8e-ae90-9f61a0f3e90f5.gif)
已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 指针,本章主要内容,指针的基本概念 指针与数值型数组 指针与字符数组(字符串) 指针数组与指向指针的指针,8.1 概述,一、指针概念 1、内存、地址 内存:存放了计算机正在运行的程序和程序正在使用的数据。 内存的基本单元是字节(Byte)。 地址:内存单元编号。CPU给每个内存单元一个编号 变量的地址:系统为变量分配内存单元地址。 存储内容:内存单元中的数据值。 int a; float b; char c; a=3; b=5; c=a;,2、指针变量的定义,指针:就是地址。即内存单元的编号。 指针变量:用来存放内存地址的变量。(某一变量的地址) 指针变量的定义:类型说明符 *指针变量名。 int *p; int *p=,3、访问变量方式,直接访问方式: 这种访问方式就是按变量的地址存取变量的值 printf(“%d“,a); a=5; 间接访问方式:(通过另一变量访问该变量的值) C语言中,允许使用一种特殊的变量,它专门用来存放另外一些变量占用的存储单元的地址。 printf(“%d“,*p); *p=5;,4.指针变量的引用,例8.1利用指针输出变量的值。 #include void main() int a,b; int *p1,*p2; scanf(“%d,%d“, 运行结果: 输入:3 6 3 6 3 6,8.2 指针变量,二、指针的运算 1指针运算符(单目运算符,其结合性为自右至左) ,2指针变量的运算,赋值运算 指针变量初始化赋值. int a; int *p=,指针变量的初始化 一般形式:存储类型 数据类型 *指针名=初始地址值;,赋给指针变量, 不是赋给目标变量,例 int i; int *p=,变量必须已说明过 类型应一致,例 int i; int *p=,用已初始化指针变量作初值,例 main( ) int i; static int *p= (),不能用auto变量的地址 去初始化static型指针,2指针变量的运算,(2) 指针的算术运算 指针和整数进行加减运算 int a5,*p; y=*p+5; y=+*p; y=*p+; p=a; p=p+2; 2)指针的自增和自减 与整数加减的本质是一样的。 p+;p-; 3) 两个指针变量相减 表示两地址之间可容纳的相应类型数据的个数。 p1-p2,2指针变量的运算,(3) 指针变量的关系运算 = = != pf1=pf2表示pf1和pf2指向同一数组元素; pf1pf2表示pf1处于高地址位置; pf1pf2表示pf2处于低地址位置。 指针变量还可以与0比较。 #define NULL 0 int *p=NULL; int *p=0; 注:指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。,例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); ,危险!,例 main( ) int i=10,k; int *p; p= ,指针变量必须先赋值,再使用.,例8.2利用指针输出变量的值(交换指针)。,#include void main() int a=5,b=8; int *p1,*p2,*p; p1= 运行结果: 5 8 8 5 5 8,例8.3利用指针输出变量的值(交换指针所指变量的值)。,#include void main() int a,b,temp; int *p1,*p2; a=5;b=8; p1= 运行结果: 5 8 8 5,8.3 指针与函数,三、指针与函数 1、指针作为函数参数 #include void swap(int x,int y ) int t; t=x; x=y; y=t void main() int a=3,b=5; swap(a, b); printf(“%d%dn”,a,b); ,#include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t void main() int a=3,b=5; swap( ,8.3 指针与函数,三、指针与函数 1、指针作为函数参数 #include void swap(int x,int y ) int t; t=x; x=y; y=t; void main() int a=3,b=5; swap(a, b); printf(“%5d%5dn“,a,b); ,#include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t; void main() int a=3,b=5; swap( ,1、指针作为函数参数 2、在被调函数中改变的是指针所指变量的值,#include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t; void main() int a=3,b=5; swap( ,#include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t; void main() int a=3,b=5,*p= ,注意:1、指针作为函数参数 2、在被调函数中不能通过改变指针形参的值使指针实参的值改变。,#include void swap(int *x,int *y ) int *t; t=x;x=y;y=t; void main() int a=3,b=5,*p= ,例题,#include void f(int *p,int *q); main() int m=1,n=2,*r= 程序运行后的输出结果是(A )。 A) 1,3 B) 2,3 C) 1,4 D) 2,4,例题,有以下程序 #include sub(int x,int y,int *z) *z=y-x; void main() int a,b,c; sub(10,5, 程序的运行结果是(B)。 A) 5,2,3 B) -5,-12,-7 C) -5,-12,-17 D) 5,-2,-7,例题,程序运行后的输出结果是 A) 7,2,5,4,3,6,1 B) 1,6,3,4,5,2,7 C) 7,6,5,4,3,2,1 D) 1,7,3,5,6,2,1,有以下程序(函数fun只对下标为偶数的元素进行操作) #include void fun (int *a,int n) int i, j, k, t; for(i=0;iak) k=j; t=ai;ai=ak;ak=t; main() int aa10=1,2,3,4,5,6,7,i; fun(aa,7); for(i=0;i7;i+) printf(“%d“,aai); printf(“n“); ,例题,A) ABCD BCD CD D B) A B C D C) B C D D) BCD CD D 答案:D,有如下程序 #include main() char s=“ABCD“, *p; for(p=s+1;ps+4;p+) printf(“%sn“,p); 该程序的输出结果是,案例,/* 用指针访问简单变量示例 */ #include void main() int a,b,*p1,*p2; p1 = ,指针的基本概念,指针是C语言的重要特征,是C语言访问内存数据和程序的灵活 和有效的手段。,C语言的指针支持: 函数的地址调用; 动态分配内存; 数组的地址引用。,内存、地址、指针 (Memory ,Address, Pointer),内存存放了计算机正在运行的程序和程序正在使用的数据。内 存的基本单元是字节(Byte)。,为了访问内存单元,CPU给每个内存单元一个编号,该编号称 为该内存单元的地址。,变量是程序中可以改变的量,当说 明变量时,系统将为其在内存中开辟相 应得内存单元。由此确定变量的地址及 内存中的表示方式。,2000H,2001H,2002H,2003H,int a=0;,a 的 内 存 单 元,a的地址&a,如果有一变量p,其内容存放了a的 地址&a,通过p也可实现对a的访问,p 称为指针,并指向a。,00H,20H,0,0,p,指针的说明,指针是特殊类型的变量,其内容是变量的地址。在使用前必须 说明,说明某标识符是指针类型,并可指向某种类型的对象。,指针的说明格式: type *pname1,*pnamen;,标识符命名的指针变量名。,指针标志。,指针指向对象的类型。,int *p, *q; /* p、q是指向整型变量的指针。*/,float *pfValue ,*pf; /* pfValue和pf是指向浮点型的指针。*/,指针对变量的引用,定义指针的目的是通过指针引用内存对象,指针的引用应按如 下步骤进行:,说明指针,int a=0, *p;,指针指向对象,p=,通过指针引用对象,*p=*p+2;,4.指针操作的两种运算符:,取地址运算 & &a表示取变量a地址的运算。,间接运算 * *p表示取指针p指向变量内容的运算。,int a,*p;,2000H,a,p,p= /* p指向a。 */,2000H,*p=2;,2,举例:,#include void main () int x ,*p; x=55; p= ,2000H,x,p,2000H,55,65,关于指针的说明:,指针必须指向对象后,才能引用。,int *p; *p=2; /* Error! */, &和 * 为互补运算。,int a,*p; p= 则:&*p p *&a a,4. 指针的运算,指针是特殊类型的变量,其内容是变量的地址,因此指针的运 算及结果一定要符合地址逻辑。,五种算术运算,int a, b, *p1, *p2; p1=,a,2000H,b,2400H,p1,p2,2000H,2400H,p1+; /*含义指向a后的整型单元*/,2002H,2002H,p1- -; /*指向a前的整型单元*/,p1+n; /*指向a后的第n个整型单元*/,p1- n; /*指向a前的第n个整型单元*/,p2- p1; /*a和b之间差的单元数*/,结果 200H,p n 相当于: p的实际内容 nsizeof(*p);,六种关系运算,比较两个同类型变量之间的地址关系。,p1p2;,指针赋值运算,#include void main() int a,b,*p1,*p2; a=2; b=3; p1= ,差别,a,&a 2000H,b,&b 2400H,p1,p2,2,3,2000H,2400H,指针与数值型数组,数组是同类型的变量的集合,各元素按下标的特定顺序占据一 段连续的内存,各元素的地址也连续,指针对数组元素非常方便。,指针与一维数组,通过指针引用数组元素可以分以下三个步骤:,说明指针和数组,int *p,a10;,指针指向数组,p=a; /*指向数组的首地址*/ p= /*指向数组的首地址*/,通过指针引用数组元素,当指针指向数组的首地址时,则下标为i的元素地址为: p+i 或a+i,引用数组元素可以有三种方法:,下标法: a i 指针法: *(p+i) 数组名法:*(a+i),注意:数组名是地址常量,不能改变!,a=p; /*Error!*/,/* 通过指针访问数组元素 */ #include void main() double Array10,Avg,*Pointer; int i; Avg = 0; Pointer = Array; /* 指针指向数组 */ for(i=0; i10; i+) scanf(“%lf“,Pointer + i); /*Pointer+i为下标为i的元素地址*/ Avg += *(Pointer + i); /* 累加各个元素的值 */ Avg /= 10; printf(“The avgerage of array is: %lfn“,Avg); ,【例1】有一个具有10个元素的数组,通过指针求其所有元素的平均值。,/* 通过指针求数组元素最大值及其位置*/ #include void main() int Array10,*ipCur; /* ipCur遍历访问数组的指针 */ int *ipPos; /* ipPos最大元素地址*/ int i; ipCur = Array; /*指针指向数组*/ for(i=0; i10; i+) scanf(“%d“, ipCur+); /* ipCur为下标为i的数组元素的地址 */ ipPos = Array; /* 指向数组首地址 */ /* 设下标为0的元素为最大值 */ ipCur = Array + 1;,【例2】通过指针求数组的最大值及其位置。,for(i=1; i *ipPos) ipPos = ipCur; /* ipPos保存最大元素的地址*/ ipCur+; /*指向下一元素*/ printf(“The max is %dn“,*ipPos); printf(“The position is %dn“,ipPos-Array); ,举例:打印数组中的奇数。,#include void main(void ) int i ,a 10 ; for (i=0 ; i10 ; i+ ) scanf ( “ %d” , ,数组元素法。,循环输入。,循环判断,满足条件输出。,数组名法。,a+i,*(a+i),指针法。,*p ;,p = a;,p+,*(p+i),结果是否 正确?,p= a; *p=*,注意指针在运算时的变化。,2.指针与二维数组,如下说明数组 int a34=1,2,3,4,5,6,7,8,9,10,11,12;,其二维结构如下:,行,列,为了便于索引,C语言将数组分为两级管理。,a0,a1,a2,将a理解为一维数组, 数组有三个元素,它们分别为a0、 a1,a2 。各个元素又是一个有四个元素的一维数组。,从地址的角度看: a 为a0 第一行的首地址 a+1 为a1 第二行的首地址 a+2 为a2 第三行的首地址,a+1 地址一次加一行。,i行j列数组元素的地址可以由a i +j得到。,数组名地址的两级管理,a,a0,a1,a2,a00 a01 a02 a03,a10 a11 a12 a13,a20 a21 a22 a23,等价地址及其管理方式,数组名是数组的地址,而且是常量,* 运算不改变其值!,以下三种地址等价:,a+i,*(a+i),a i ,加法按行递增,加法按列递增,(a+1)+1,*(a+1)+1,差别?,(6)数组名表示数组元素,a i j ,(*(a+i) j ,*(*(a+i)+j),*(a i +j),指针与二维数组,int *p, a34; p=a; aij *(p+4*i+j)等价!,a00,a,a01,a02,a0,a10,a11,a12,a1,a20,a21,a22,a2,a+1,a1+2,/* 求二维数组最小值及其位置 */ #include void main(void) int a34,i,j; int iMinRow,iMinCol; /*iMinRow最小值的行,iMinCol最小值的列 */ for(i=0; i3; i+) for(j=0; j4; j+) scanf(“%d“,ai + j); /* ai+j为i行j列元素的地址 */ iMinRow = 0; iMinCol = 0; /*假定a00为最小值*/ for(i=0; i3; i+) for(j=0; j4; j+) if(*(*(a + i) + j) aiMinRowiMinCol) iMinRow = i; iMinCol = j; /* 修正i和j为新的最小值下标 */ printf(“The min is a%d%d=%dn“, iMinRow,iMinCol,aiMinRowiMinCol); ,【例3】输入三行四列的整型数组,求最小值及其位置。,/* 通过指针求二维数组元素的累加和 */ #include void main(void) int i,j,a23,sum; int *p; p = (int *)a;/*p指向数组a,由于a加1加1行,转换为整型指针*/ for(i=0; i2; i+) for(j=0; j3; j+) scanf(“%d”,ai + j); /* ai + j为i行j列元素的地址*/ sum = 0; for(i=0; i2; i+) for(j=0; j3; j+) sum += *(p + i*3 +j); /* 通过指针p表示aij */ printf(“The sum of a = %dn“,sum); ,【例4】输入两行三列的整型数组,通过指针求所有元素的累加和。,举例: 在数组a中查找输入的数,输出行列位置。,#include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d” , ,下标法。,*(a i +j),*(*(a+i)+j),*(p+4*i+j),【例5】输入3行4列的浮点型数组,通过指针求数组的平均值。,/* 通过指针求二维数组的平均值 */ #include void main(void) int i,j; float a34,fAvg; float (*p)4; p = a; /*指针指向数组*/ fAvg = 0; for(i=0; i3; i+) for(j=0; j4; j+) scanf(“%f”,pi+j); /* pi + j为i行j列元素的地址*/ fAvg += pij; /* pij表示aij*/ fAvg /=12; printf(“The average of a = %fn“,fAvg); ,指针与字符串(字符数组),字符串在内存中可以存储为两种形式:,字符数组 字符串常量,可以使指针指向字符数组或字符串常量,通过指针引用字符数 组或字符串的各个字符。,1.指针与字符数组:,char *chp,str =”Hello!”; /*说明字符指针和字符数组*/ chp=str; /*指针指向字符数组*/ putchar( *(chp+2); /*通过指针引用数组元素*/,2.指针与字符串:,char *strp; /*说明字符指针*/ strp=“Hello!”; /*指针指向字符串*/ puts(strp); /*通过指针引用字符串*/,说明指针时,可以同时赋初值,如:,char *strp=“Hello!”;,赋值表示将字符串的地址赋给指针!,/* 通过指针访问字符串常量 */ #include void main(void) char *p; /* 说明指向字符的指针p */ int iNumOfi; p = “This is a test string”; /* 指针指向字符串常量 */ iNumOfi = 0; while(*p!=0) if(*p = i) iNumOfi+; p+; printf(“In the string the number of i = %dn“,iNumOfi); ,【例6】统计字符串常量中的小写字母i的数量。,/* 通过指针访问字符数组 */ #include void main(void) char str80, *chp; /* 说明字符数组及指向字符的指针 */ chp = str; /* 指针指向字符数组 */ gets(chp); while(*chp != 0) if(*chp = a ,【例7】输入字符串,将其中小写字母转换成大写字符,其余的字符不变,输出结果。,举例:将字符串中的大写字母转化对应的小写字母。,#include void main(void) char *p,s80; p=s; gets(p); for(;*p!=0;p+) if(*p=A ,举例:将无符号的八进制字符串转换为十进制整数。,#include void main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn”,n); ,p指向s数组。,输入字符串。,s,p,s,5,5,6,0,n=0*8+5-05,n=5*8+5-045,n=45*8+6-0366,指针数组和指向指针的指针,指针是存放其它数据对象地址的变量。因此,指针可以构成数 组。每个数组元素为一个指针变量,且在内存中连续存放。,指针数组的说明,说明格式: type *数组名const exp;,int *p 4 ;,含义是在内存中开辟空间,并指明元素所指向的对象的类型。,数组名p为数组的地址。,使用前必须让各元素指向对象。,int i, a34, *p3; for(i=0;i3;i+) p i =a i ; *(p2+1)=2; /*通过指针数组引用数组元素a21*/,/* 通过指针数组访问二维数组 */ #include void main(void) int a34; int *p3; /* 说明行数相同的指针数组 */ int i,j; int iSumOfPosi,iCountOfPosi; for(i=0; i3; i+) pi = ai; /* 指针数组元素指向对应的行 */ for(j=0; j4; j+) scanf(“%d“,pi + j); iSumOfPosi = 0; iCountOfPosi =0;,【例8】统计3行4列整型二维数组中正数的个数,并求正数的累加和,输出结果。,for(i=0; i 0) iSumOfPosi += *(pi+j); /* 通过指针数组访问二维数组 */ iCountOfPosi+; printf(“The sum of posi-numb in array is %dn“,iSumOfPosi); printf(“The number of posi-numb in array is %dn“,iCountOfPosi); ,指针数组的应用举例,通过指针数组按数学方式输出数组的值。,#include void main ( ) int i , j; int a34= 1,2,3,4, 5,6,7,8, 9,10,11,12 ; int *p3; p0 = a0; p1 = a1 ; p2 = a2; for (i=0 ; i3 ; i+) f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 监理员培训证考试题库及答案
- 湘潭初三中考试卷子及答案
- 连江七中分班考试试卷及答案
- 设备管理知识测试题附答案:涵盖设备新度系数、保养、故障处理等测试卷有答案
- 2025年病历书写管理制度试题及答案
- 智能化仓储材料循环利用-洞察与解读
- 2025贵州习水县招聘城镇公益性岗位19人(4月)考前自测高频考点模拟试题及答案详解(网校专用)
- 河南水安考试题型及答案
- 消费文化与产品再购买频率-洞察与解读
- 2025国考北京市环境监察岗位申论题库含答案
- 浅谈如何做好危化品安全管控工作
- 人工智能技术及应用习题答案题库
- 县中医院妇科重点专科建设汇报
- 坚持人民至上 工会研讨发言
- 美学原理全套教学课件
- 期末复习(课件)新思维英语四年级上册
- 子宫脱垂试题及答案
- GB/T 90.1-2023紧固件验收检查
- 中国政治思想史复习资料
- 2023年度广东省成人高考《英语》(高升本)真题库及答案(单选题型)
- 《中国民间故事》阅读指导课
评论
0/150
提交评论