理学指针PPT学习教案_第1页
理学指针PPT学习教案_第2页
理学指针PPT学习教案_第3页
理学指针PPT学习教案_第4页
理学指针PPT学习教案_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、会计学1 理学指针理学指针 第1页/共56页 第2页/共56页 第3页/共56页 第4页/共56页 第5页/共56页 第6页/共56页 赋给指针变量, 不是赋给目标变量 例 int i; int *p= 变量必须已说明过 类型应一致 例 int *p= int i; 例 int i; int *p= int *q=p; 用已初始化指针变量作初值 例 main( ) int i; static int *p= . () 不能用auto变量的地址 去初始化static型指针 第7页/共56页 第8页/共56页 第9页/共56页 例 main( ) int i=10; int *p; *p=i; p

2、rintf(“%d”,*p); 危险! 例 main( ) int i=10,k; int *p; p= *p=i; printf(“%d”,*p); 指针变量必须先赋值,再使用. . 2000 2004 2006 2005 整型变量i 10 指针变量p 2001 2002 2003 随机 第10页/共56页 第11页/共56页 第12页/共56页 #include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t void main() int a=3,b=5; swap( printf(“%d%dn”,a,b); 第13页/共56页 #inc

3、lude void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t; void main() int a=3,b=5; swap( printf(%d%dn,a,b); 第14页/共56页 #include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t; void main() int a=3,b=5; swap( printf(%5d%5dn,a,b); #include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t; void main() int

4、 a=3,b=5,*p= swap(p, q); printf(%5d%5dn,a,b); 第15页/共56页 #include void swap(int *x,int *y ) int *t; t=x;x=y;y=t; void main() int a=3,b=5,*p= swap(p, q); printf(%5d%5dn,a,b); printf(%5d%5dn,*p,*q); 第16页/共56页 #include void f(int *p,int *q); main() int m=1,n=2,*r= f(r,printf(%d,%d,m,n); void f(int *p,in

5、t *q) p=p+1;*q=*q+1; 程序运行后的输出结果是(程序运行后的输出结果是(A )。)。 A) 1,3 B) 2,3 C) 1,4 D) 2,4 第17页/共56页 有以下程序有以下程序 #include sub(int x,int y,int *z) *z=y-x; void main() int a,b,c; sub(10,5, sub(7,a, sub(a,b, printf(%4d,%4d,%4dn,a,b,c); 程序的运行结果是(程序的运行结果是(B)。)。 A) 5,2,3 B) -5,-12,-7 C) -5,-12,-17 D) 5,-2,-7 第18页/共56

6、页 程序运行后的输出结果是程序运行后的输出结果是 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;in-2;i+=2) k=i; for(j=i;jak) k=j; t=ai;ai=ak;ak=t; main() int aa10=1,2,3,4,5,6,7,i; fun(aa,7); for(i

7、=0;i7;i+) printf(%d,aai); printf(n); 第19页/共56页 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); 该程序的输出结果是该程序的输出结果是 第20页/共56页 第21页/共56页 指针是指针是C语言的重要特征,是语言的重要特征,是C语言访问内存数据和程序的灵活语言访问内存数据和程序的灵活 和有效的手段。和有效的手段。 C C语言的指针支持

8、:语言的指针支持: 函数的地址调用;函数的地址调用; 动态分配内存;动态分配内存; 数组的地址引用。数组的地址引用。 第22页/共56页 内存存放了计算机正在运行的程序和程序正在使用的数据。内内存存放了计算机正在运行的程序和程序正在使用的数据。内 存的基本单元是字节存的基本单元是字节(Byte)。 为了访问内存单元,为了访问内存单元,CPU给每个内存单元一个编号,该编号称给每个内存单元一个编号,该编号称 为该内存单元的地址。为该内存单元的地址。 变量是程序中可以改变的量,当说变量是程序中可以改变的量,当说 明变量时,系统将为其在内存中开辟相明变量时,系统将为其在内存中开辟相 应得内存单元。由此

9、确定变量的地址及应得内存单元。由此确定变量的地址及 内存中的表示方式。内存中的表示方式。 2000H 2001H 2002H 2003H int a=0; a 的的 内内 存存 单单 元元 a的地址的地址 标识符命名的指针变量名标识符命名的指针变量名 。 指针标志。指针标志。 指针指向对象的类型。指针指向对象的类型。 int *p, *q; /* p、q是指向整型变量的指针。是指向整型变量的指针。*/ float *pfValue ,*pf; /* pfValue和和pf是指向浮点型的指针。是指向浮点型的指针。*/ 第24页/共56页 定义指针的目的是通过指针引用内存对象,指针的引用应按如定义

10、指针的目的是通过指针引用内存对象,指针的引用应按如 下步骤进行:下步骤进行: 说明指针说明指针 int a=0, *p; 指针指向对象指针指向对象p= 通过指针引用对象通过指针引用对象*p=*p+2; 4.指针操作的两种运算符:指针操作的两种运算符: 取地址运算取地址运算 2000H a p p= /* p指向指向a。 */ 2000H *p=2; 2 第25页/共56页 #include void main () int x ,*p; x=55; p= printf ( “ %d, %u ”, x, *p) ; *p=65; printf ( “ %d, %u”, x, *p) ; 2000

11、Hx p2000H 55 65 关于指针的说明:关于指针的说明: 指针必须指向对象后,才能引用。指针必须指向对象后,才能引用。 int *p; *p=2; /* Error! */ p= 则:则: p1= p2= 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之间差的单元

12、数之间差的单元数*/ 结果结果 200H p n 相当于相当于: p的实际内容的实际内容 n sizeof(*p); 六种关系运算六种关系运算 比较两个同类型变量之间的地址关系。比较两个同类型变量之间的地址关系。 p1p2; 第27页/共56页 #include void main() int a,b,*p1,*p2; a=2; b=3; p1= p2= *p1=*p2; printf(“%d,%dn”,a,b); a=3; b=5; p1=p2; printf(“%d,%d”,*p1,*p2); 差别差别 a 指针指向数组指针指向数组p=a; /*指向数组的首地址指向数组的首地址*/ p=

13、/*指向数组的首地址指向数组的首地址*/ 通过指针引用数组元素通过指针引用数组元素 当指针指向数组的首地址时,则下标为当指针指向数组的首地址时,则下标为i的元素地址为:的元素地址为: p+i 或或a+i 引用数组元素可以有三种方法:引用数组元素可以有三种方法: 下标法:下标法: a i 指针法:指针法: *(p+i) 数组名法:数组名法:*(a+i) 注意:数组名是地址常量,不能改变!注意:数组名是地址常量,不能改变! a=p; /*Error!*/ 第29页/共56页 /* 通过指针访问数组元素通过指针访问数组元素 */ #include void main() double Array10

14、,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个元素的数组,通过指针求其所有元素的 平均值。 第30页/共56页 /* 通过指针求数组元素

15、最大值及其位置通过指针求数组元素最大值及其位置*/ #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的元素为最大值

16、的元素为最大值 */ ipCur = Array + 1; 【例2】通过指针求数组的最大值及其位置。 第31页/共56页 for(i=1; i *ipPos) ipPos = ipCur; /* ipPos保存最大元素的地址保存最大元素的地址*/ ipCur+; /*指向下一元素指向下一元素*/ printf(The max is %dn,*ipPos); printf(The position is %dn,ipPos-Array); 第32页/共56页 #include void main(void ) int i ,a 10 ; for (i=0 ; i10 ; i+ ) scanf (

17、 “ %d” , for (i=0 ; i10 ; i+) if ( a i % 2 ) printf ( “ %d”, a i ); 数组元素法。数组元素法。 循环输入。循环输入。 循环判断,满足条件输出。循环判断,满足条件输出。 数组名法。数组名法。 a+i *(a+i) 指针法。指针法。 ,*p ; p = a; p+ *(p+i) 结果是否结果是否 正确?正确? p= a; *p=* 注意指针在运算时的变化。注意指针在运算时的变化。 第33页/共56页 如下说明数组如下说明数组 int a34=1,2,3,4,5,6,7,8,9,10,11,12; 其二维结构如下:其二维结构如下: 1

18、234 5 678 9101112 行行 列列 为了便于索引,为了便于索引,C语言将数组分为两级管理。语言将数组分为两级管理。 a0 a1 a2 将将a理解为一维数组,理解为一维数组, 数组有三个元素,它们分别为数组有三个元素,它们分别为a0、 a1,a2 。各个元素又是一个有四个元素的一维数组。各个元素又是一个有四个元素的一维数组。 从地址的角度看:从地址的角度看: a 为为a0 第一行的首地址第一行的首地址 a+1 为为a1 第二行的首地址第二行的首地址 a+2 为为a2 第三行的首地址第三行的首地址 a+1 地址一次加一行。地址一次加一行。 i行行j列数组元素的地址可以由列数组元素的地址

19、可以由a i +j得到。得到。 第34页/共56页 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 差别?差别? 第35页/共56页 a i j (*(a+i) j *(*(a+i)+j) *(a i +j) 指针与二维数组指针与二维数组

20、 int *p, a34; p=a; aij *(p+4*i+j)等价!等价! a00a a01 a02 a0 a10 a11 a12 a1 a20 a21 a22 a2 a+1 a1+2 第36页/共56页 /* 求二维数组最小值及其位置求二维数组最小值及其位置 */ #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行行

21、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】输入三行四列的整型数组,求最小值及其位置。 第37页/共56页 /* 通过指针求二维数

22、组元素的累加和通过指针求二维数组元素的累加和 */ #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表示表示

23、aij */ printf(The sum of a = %dn,sum); 【例4】输入两行三列的整型数组,通过指针求所有元素的累加和。 第38页/共56页 #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” , for(i=0;i3;i+) for(j=0;j4;j+) if(iS= a i j ) printf(“iS equal to a%d %d n”,i , j); 下标法。下标法。 *(a i +j)*(*(a+i)+j)*(p+

24、4*i+j) 第39页/共56页 【例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; p

25、rintf(The average of a = %fn,fAvg); 第40页/共56页 字符串在内存中可以存储为两种形式:字符串在内存中可以存储为两种形式: 字符数组字符数组 字符串常量字符串常量 可以使指针指向字符数组或字符串常量,通过指针引用字符数可以使指针指向字符数组或字符串常量,通过指针引用字符数 组或字符串的各个字符。组或字符串的各个字符。 1.指针与字符数组:指针与字符数组: char *chp,str =”Hello!”; /*说明字符指针和字符数组说明字符指针和字符数组*/ chp=str; /*指针指向字符数组指针指向字符数组*/ putchar( *(chp+2); /

26、*通过指针引用数组元素通过指针引用数组元素*/ 第41页/共56页 2.指针与字符串:指针与字符串: char *strp; /*说明字符指针说明字符指针*/ strp=“Hello!”; /*指针指向字符串指针指向字符串*/ puts(strp); /*通过指针引用字符串通过指针引用字符串*/ 说明指针时,可以同时赋初值,如:说明指针时,可以同时赋初值,如: char *strp=“Hello!”; 赋值表示将字符串的地址赋给指针!赋值表示将字符串的地址赋给指针! 第42页/共56页 /* 通过指针访问字符串常量通过指针访问字符串常量 */ #include void main(void)

27、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的数量。 第43页/共56页 /* 通过指针访问字符数组通过指针访问字符数组 */ #include void main(void) char str8

28、0, *chp; /* 说明字符数组及指向字符的指针说明字符数组及指向字符的指针 */ chp = str; /* 指针指向字符数组指针指向字符数组 */ gets(chp); while(*chp != 0) if(*chp = a chp+; /* 指针指向下一字符指针指向下一字符 */ puts(str); 【例7】输入字符串,将其中小写字母转换成大写字符,其余的字 符不变,输出结果。 第44页/共56页 #include void main(void) char *p,s80; p=s; gets(p); for(;*p!=0;p+) if(*p=A p=s; puts(p); 第45

29、页/共56页 #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 ps 5 5 6 0 n=0*8+5-05 n=5*8+5-045 n=45*8+6-0366 第46页/共56页 指针是存放其它数据对象地址的变量。因此,指针可以构成数指针是存放其它数据对象地址的变量。因此,指针可以构成数 组。每个数组元素为一个指针变量,且在内存中连续存放。组。每个数组元素为一个指针变量,且在内存

30、中连续存放。 指针数组的说明指针数组的说明 说明格式:说明格式: type *数组名数组名const exp; int *p 4 ; 含义是含义是在内存中开辟空间,并指明元素所指向的对象的类型。在内存中开辟空间,并指明元素所指向的对象的类型。 p 0 p 1 p 2 p 3 数组名数组名p为数组的地址。为数组的地址。 使用前必须让各元素指向对象。使用前必须让各元素指向对象。 int i, a34, *p3; for(i=0;i3;i+) p i =a i ; *(p2+1)=2; /*通过指针数组引用数组元素通过指针数组引用数组元素a21*/ 第47页/共56页 /* 通过指针数组访问二维数组

31、通过指针数组访问二维数组 */ #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列整型二维数组中正数的个数,并求正数的累加 和,输出结果。 第48页/共56页

32、for(i=0; i3; i+) for(j=0; j 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); 第49页/共56页 通过指针数组按数学方式输出数组的值。通过指针数组按数学方式输出数组的值。 #include void main ( ) int i , j;

33、 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+) for (j=0; j4; j+) printf (“ %5d” , *(pi+j); printf ( “n” ) ; 1234 5678 9 101112 p0 数组数组a的二维结构的二维结构 p1 p2 a0 a1 a2 每输出一行,打印回车。每输出一行,打印回车。 第50页/共56页 /* 通过指针数组访问二维字符数组通过指针数组访问二维字符数组 */ #include #include void main(void) char strName510,*strP5,*strTemp = NULL; int i,j; for(i=0; i5; i+) strPi = strNamei;/* 指针数组的各个元素指向字符数组的指针数组的各个元素指向字符数组的

温馨提示

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

评论

0/150

提交评论