[理学]第8章指针ppt课件_第1页
[理学]第8章指针ppt课件_第2页
[理学]第8章指针ppt课件_第3页
[理学]第8章指针ppt课件_第4页
[理学]第8章指针ppt课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 指针本章主要内容本章主要内容指针的根本概念指针的根本概念指针与数值型数组指针与数值型数组指针与字符数组字符串指针与字符数组字符串指针数组与指向指针的指针指针数组与指向指针的指针8.1 概述概述一、指针概念一、指针概念1 1、内存、地址、内存、地址内存内存: :存放了计算机正在运转的程序和程序正在运用存放了计算机正在运转的程序和程序正在运用的数据。的数据。 内存的根本单元是字内存的根本单元是字节节(Byte)(Byte)。地址地址: :内存单元编号。内存单元编号。CPUCPU给每个内存单元一个编号给每个内存单元一个编号变量的地址:系统为变量分配内存单元地址。变量的地址:系统为变量分配内存

2、单元地址。存储内容:内存单元中的数据值。存储内容:内存单元中的数据值。int a;int a;float b;float b;char c;char c;a=3;a=3;b=5;b=5;c=c=a a; ;2、指针变量的定义、指针变量的定义指针:就是地址。即内存单元的编号。指针:就是地址。即内存单元的编号。指针变量:用来存放内存地址的变量。某一变量的地址指针变量:用来存放内存地址的变量。某一变量的地址指针变量的定义:类型阐明符指针变量的定义:类型阐明符 *指针变量名。指针变量名。int *p; int *p=&a; p中存放地址,指向的数据是整型中存放地址,指向的数据是整型p=&

3、;a;float *q; float *q =&b; q中存放地址,指向的数据是实型中存放地址,指向的数据是实型q=&b;char *r; char *r =&c; r中存放地址,指向的数据是字符型中存放地址,指向的数据是字符型r=&c;3、访问变量方式、访问变量方式直接访问方式直接访问方式: 这种访问方式就是按变量的地址存取变量的值这种访问方式就是按变量的地址存取变量的值 printf%d,a; a=5;间接访问方式间接访问方式:经过另一变量访问该变量的值经过另一变量访问该变量的值 C言语中,允许运用一种特殊的变量,它专门言语中,允许运用一种特殊的变量,它专门

4、用来存放另外一些变量占用的存储单元的地址。用来存放另外一些变量占用的存储单元的地址。 printf%d,*p; *p=5;4.指针变量的援用指针变量的援用例例8.1利用指针输出变量的值。利用指针输出变量的值。#include void main()int a,b;int *p1,*p2;scanf(%d,%d,&a,&b);p1=&a;p2=&b;printf(%d %dn,*p1,*p2);printf(%d %dn,a,b);运转结果:运转结果:输入:输入:3 6 3 63 68.2 指针变量指针变量二、指针的运算二、指针的运算1 1指针运算符单目运算符,其

5、结合性为自右至左指针运算符单目运算符,其结合性为自右至左& &取地址运算符:取变量的地址取地址运算符:取变量的地址* *取内容运算符:表示指针变量所指的变量。取内容运算符:表示指针变量所指的变量。注:注: 在在* *运算符之后跟的变量必需是指针变量。运算符之后跟的变量必需是指针变量。 int int * *p1,p1,* *p2; p2; 和和 * *p=5; p=5; 中的中的* *不不是一回事。是一回事。 指针阐明符指针阐明符 取内容运算符取内容运算符 判别正确吗?判别正确吗?int int * *p=&a;p=&a; * *p=&a;p=&

6、a;2指针变量的运算赋值运算赋值运算指针变量初始化赋值指针变量初始化赋值.int a;int *p=&a;2) 把一个变量的地址赋予指向一样数据类型的指针变量。把一个变量的地址赋予指向一样数据类型的指针变量。int a,*p;p=&a; 3) 把一个指针变量的值赋予指向一样类型变量的另一个指针把一个指针变量的值赋予指向一样类型变量的另一个指针变量。变量。int a,*p=&a,*q;p=q;l指针变量的初始化指针变量的初始化l普通方式:普通方式: 存储类型存储类型 数据类型数据类型 * *指针名指针名= =初始地址值;初始地址值;赋给指针变量,不是赋给目的变量例 int

7、 i; int *p=&i;变量必需已阐明过类型应一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指针变量作初值例 main( ) int i; static int *p=&i; . ()不能用auto变量的地址去初始化static型指针2指针变量的运算(2) 指针的算术运算指针的算术运算指针和整数进展加减运算指针和整数进展加减运算 int a5,*p; y=*p+5; y=+*p; y=*p+; p=a; p=p+2; 2指针的自增和自减指针的自增和自减与整数加减的本质是一样的。与整数加减的本质是

8、一样的。 p+;p-; 3) 两个指针变量相减两个指针变量相减表示两地址之间可包容的相应类型数据的个数。表示两地址之间可包容的相应类型数据的个数。 p1-p22指针变量的运算(3) 指针变量的关系运算指针变量的关系运算 = = !=pf1=pf2表示表示pf1和和pf2指向同一数组元素;指向同一数组元素;pf1pf2表示表示pf1处于高地址位置;处于高地址位置;pf1pf2表示表示pf2处于低地址位置。处于低地址位置。指针变量还可以与指针变量还可以与0比较。比较。#define NULL 0int *p=NULL; int *p=0; 注:指针变量未赋值时,可以是恣意值,是不能运用的。否注:指

9、针变量未赋值时,可以是恣意值,是不能运用的。否那么将呵斥不测错误。而指针变量赋那么将呵斥不测错误。而指针变量赋0值后,那么可以值后,那么可以运用,只是它不指向详细的变量而已。运用,只是它不指向详细的变量而已。例 main( ) int i=10; int *p; *p=i; printf(“%d,*p); 危险!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d,*p); 指针变量必需先赋值,再运用.2000200420062005整型变量i10指针变量p200120022003随机例例8.2利用指针输出变量的值交换指针。利用指针输

10、出变量的值交换指针。#include void main()int a=5,b=8;int *p1,*p2,*p;p1=&a; p2=&b; printf(%d %dn,*p1,*p2); p=p1;p1=p2;p2=p; printf(%d %dn,*p1,*p2);printf(%d %dn,a,b);运转结果:运转结果:5 88 55 8例例8.3利用指针输出变量的值交换指针所指变量的值。利用指针输出变量的值交换指针所指变量的值。#include void main()int a,b,temp;int *p1,*p2;a=5;b=8;p1=&a; p2=&

11、b; printf(%d %dn,a,b);temp=*p1;*p1=*p2;*p2=temp; printf(%d %dn,a,b);运转结果:运转结果:5 88 58.3 指针与函数指针与函数三、指针与函数三、指针与函数1 1、指针作为函数参数、指针作为函数参数#include #include void swap(int x,int y )void swap(int x,int y ) int t;int t;t=x; x=y; y=tt=x; x=y; y=t void main()void main() int a=3,b=5;int a=3,b=5;swap(a, b);swap(

12、a, b);printf(printf(“%d%dn%d%dn,a,b);,a,b); #include void swap(int *x,int *y ) int t;t=*x;*x=*y;*y=tvoid main()int a=3,b=5;swap(&a,&b);printf(“%d%dn,a,b);8.3 指针与函数指针与函数三、指针与函数三、指针与函数1 1、指针作为函数参数、指针作为函数参数#include #include void swap(int x,int y )void swap(int x,int y ) int t;int t;t=x; x=y; y=

13、t;t=x; x=y; y=t; void main()void main() int a=3,b=5;int a=3,b=5;swap(a, b);swap(a, b);printf(%5d%5dn,a,printf(%5d%5dn,a,b);b); #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);1、指针作为函数参数、指针作为函数参数2、在被调函数中改动的是指针所指变量的值、在被调函数中改动的是指针所指

14、变量的值#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,*p=&a,*q=&b;swap(p, q);printf(%5d%5dn,a,b);留意:留意:1、指针作为函数参数、指针作为函数参数 2、在被调函数中不能经过改动

15、指针形参的值使指针、在被调函数中不能经过改动指针形参的值使指针实参的值改动。实参的值改动。#include void swap(int *x,int *y ) int *t;t=x;x=y;y=t;void main() int a=3,b=5,*p=&a,*q=&b;swap(p, q);printf(%5d%5dn,a,b);printf(%5d%5dn,*p,*q);例题例题#include void f(int *p,int *q); main() int m=1,n=2,*r=&m; f(r,&n);printf(%d,%d,m,n); void f(

16、int *p,int *q) p=p+1;*q=*q+1; 程序运转后的输出结果是程序运转后的输出结果是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,&a); sub(7,a,&b); sub(a,b,&c); printf(%4d,%4d,%4dn,a,b,c);程序的运转结果是程序的运转结果是B。 A) 5,2,3 B) -5,-12,-7 C) -5,-12,-17 D) 5,-2

17、,-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;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=0

18、;i7;i+) printf(%d,aai); printf(n);例题例题A) ABCDBCDCDD B) ABCD C) BCD D) BCDCDD答案:答案:D有如下程序有如下程序#includemain() char s=ABCD, *p;for(p=s+1;ps+4;p+) printf(%sn,p);该程序的输出结果是该程序的输出结果是 案例案例 /* 用指针访问简单变量例如用指针访问简单变量例如 */ #include void main() int a,b,*p1,*p2; p1 = &a; /* p1指向指向a */ p2 = &b; /* p2指向指向b *

19、/ scanf(%d%d, p1,&b); printf(a+b=%dn, *p1+*p2); 指针的根本概念指针的根本概念 指针是指针是C言语的重要特征,是言语的重要特征,是C言语访问内存数据和程序的灵敏言语访问内存数据和程序的灵敏和有效的手段。和有效的手段。 C C言语的指针支持:言语的指针支持: 函数的地址调用;函数的地址调用; 动态分配内存;动态分配内存; 数组的地址援用。数组的地址援用。内存、地址、指针 (Memory ,Address, Pointer) 内存存放了计算机正在运转的程序和程序正在运用的数据。内内存存放了计算机正在运转的程序和程序正在运用的数据。内存的根本单元

20、是字节存的根本单元是字节(Byte)。 为了访问内存单元,为了访问内存单元,CPU给每个内存单元一个编号,该编号称给每个内存单元一个编号,该编号称为该内存单元的地址。为该内存单元的地址。 变量是程序中可以改动的量,当说变量是程序中可以改动的量,当说明变量时,系统将为其在内存中开辟相明变量时,系统将为其在内存中开辟相应得内存单元。由此确定变量的地址及应得内存单元。由此确定变量的地址及内存中的表示方式。内存中的表示方式。2000H2001H2002H2003Hint a=0;a的的内内存存单单元元a的地址的地址&a 假设有一变量假设有一变量p,其内容存放了,其内容存放了a的的地址地址&am

21、p;a,经过,经过p也可实现对也可实现对a的访问,的访问,p称为指针,并指向称为指针,并指向a。00H20H00p指针的阐明 指针是特殊类型的变量,其内容是变量的地址。在运用前必需指针是特殊类型的变量,其内容是变量的地址。在运用前必需阐明,阐明某标识符是指针类型,并可指向某种类型的对象。阐明,阐明某标识符是指针类型,并可指向某种类型的对象。指针的阐明格式:指针的阐明格式: type *pname1,*pnamen;标识符命名的指针变量名。标识符命名的指针变量名。指针标志。指针标志。指针指向对象的类型。指针指向对象的类型。int *p, *q; /* p、q是指向整型变量的指针。是指向整型变量的

22、指针。*/float *pfValue ,*pf; /* pfValue和和pf是指向浮点型的指针。是指向浮点型的指针。*/指针对变量的援用 定义指针的目的是经过指针援用内存对象,指针的援用应按如定义指针的目的是经过指针援用内存对象,指针的援用应按如下步骤进展:下步骤进展:阐明指针阐明指针 int a=0, *p;指针指向对象指针指向对象p=&a;经过指针援用对象经过指针援用对象*p=*p+2;4.指针操作的两种运算符:指针操作的两种运算符:取地址运算取地址运算 & &a表示取变量表示取变量a地址的运算。地址的运算。间接运算间接运算 * *p表示取指针表示取指针p指向变

23、量内容的运算。指向变量内容的运算。int a,*p; 2000Happ=&a; /* p指向指向a。 */2000H*p=2;2举例:#include void main () int x ,*p; x=55; p=&x; printf ( “ %d, %u , x, *p) ; *p=65; printf ( “ %d, %u, x, *p) ;2000Hxp2000H5565关于指针的阐明:关于指针的阐明:指针必需指向对象后,才干援用。指针必需指向对象后,才干援用。 int *p; *p=2; /* Error! */ &和和 * 为互补运算。为互补运算。int a

24、,*p; p=&a;那么:那么:&*p p *&a a4. 指针的运算 指针是特殊类型的变量,其内容是变量的地址,因此指针的运指针是特殊类型的变量,其内容是变量的地址,因此指针的运算及结果一定要符合地址逻辑。算及结果一定要符合地址逻辑。五种算术运算五种算术运算int a, b, *p1, *p2;p1=&a;p2=&b;a2000Hb2400Hp1p22000H2400Hp1+; /*含义指向含义指向a后的整型单元后的整型单元*/2002H2002Hp1- -; /*指向指向a前的整型单元前的整型单元*/p1+n; /*指向指向a后的第后的第n个整型单元

25、个整型单元*/p1- n; /*指向指向a前的第前的第n个整型单元个整型单元*/p2- p1; /*a和和b之间差的单元数之间差的单元数*/结果结果200Hp n 相当于相当于: p的实践内容的实践内容 nsizeof(*p);六种关系运算六种关系运算比较两个同类型变量之间的地址关系。比较两个同类型变量之间的地址关系。p1p2;指针赋值运算指针赋值运算#include void main() int a,b,*p1,*p2; a=2; b=3; p1=&a; p2=&b; *p1=*p2; printf(“%d,%dn,a,b); a=3; b=5; p1=p2; printf

26、(“%d,%d,*p1,*p2);差别差别a&a 2000Hb&b 2400Hp1p2232000H2400H指针与数值型数组指针与数值型数组 数组是同类型的变量的集合,各元素按下标的特定顺序占据一数组是同类型的变量的集合,各元素按下标的特定顺序占据一段延续的内存,各元素的地址也延续,指针对数组元素非常方便。段延续的内存,各元素的地址也延续,指针对数组元素非常方便。指针与一维数组指针与一维数组经过指针援用数组元素可以分以下三个步骤:经过指针援用数组元素可以分以下三个步骤:阐明指针和数组阐明指针和数组int *p,a10;指针指向数组指针指向数组p=a; /*指向数组的首地址指向

27、数组的首地址*/p=&a0; /*指向数组的首地址指向数组的首地址*/经过指针援用数组元素经过指针援用数组元素当指针指向数组的首地址时,那么下标为当指针指向数组的首地址时,那么下标为i的元素地址为:的元素地址为: p+i 或或a+i援用数组元素可以有三种方法:援用数组元素可以有三种方法:下标法:下标法: a i 指针法:指针法: *(p+i)数组名法:数组名法:*(a+i)留意:数组名是地址常量,不能改动!留意:数组名是地址常量,不能改动! a=p; /*Error!*/ / /* * 经过指针访问数组元素经过指针访问数组元素 * */ / #include #include void

28、 main() void main() double Array10,Avg, double Array10,Avg,* *Pointer;Pointer; int i; int i; Avg = 0; Avg = 0; Pointer = Array; Pointer = Array; / /* * 指针指向数组指针指向数组 * */ / for(i=0; i10; i+) for(i=0; i10; i+) scanf(%lf,Pointer + i); / scanf(%lf,Pointer + i); /* *Pointer+iPointer+i为下标为为下标为i i的元素地址的元素地

29、址* */ / Avg += Avg += * *(Pointer + i); /(Pointer + i); /* * 累加各个元素的值累加各个元素的值 * */ / Avg /= 10; Avg /= 10; printf(The avgerage of array is: %lfn,Avg); printf(The avgerage of array is: %lfn,Avg); 【例1】有一个具有10个元素的数组,经过指针求其一切元素的平均值。/* 经过指针求数组元素最大值及其位置经过指针求数组元素最大值及其位置*/#include void main() int Array10,*i

30、pCur; /* 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

31、 *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 , &ai ) ; for (i=0 ; i10 ; i+) if ( a i % 2 ) pr

32、intf ( “ %d, a i ); 数组元素法。数组元素法。循环输入。循环输入。循环判别,满足条件输出。循环判别,满足条件输出。数组名法。数组名法。 a+i *(a+i)指针法。指针法。 ,*p ;p = a;p+*(p+i)结果能否结果能否正确?正确?p= a; *p=&a0;*留意指针在运算时的变化。留意指针在运算时的变化。2.指针与二维数组如下阐明数组如下阐明数组int a34=1,2,3,4,5,6,7,8,9,10,11,12;其二维构造如下:其二维构造如下:12345 6789101112行行列列为了便于索引,为了便于索引,C言语将数组分为两级管理。言语将数组分为两级管

33、理。a0a1a2 将将a了解为一维数组,了解为一维数组, 数组有三个元素,它们分别为数组有三个元素,它们分别为a0、a1,a2 。各个元素又是一个有四个元素的一维数组。各个元素又是一个有四个元素的一维数组。从地址的角度看:从地址的角度看:a 为为a0 第一行的首地址第一行的首地址a+1 为为a1 第二行的首地址第二行的首地址a+2 为为a2 第三行的首地址第三行的首地址a+1 地址一次加一行。地址一次加一行。i行行j列数组元素的地址可以由列数组元素的地址可以由a i +j得到。得到。数组名地址的两级管理aa0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a

34、22 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)等价!等价!a00aa01a02a0a10a11a12a1a20a21a22a2a+1a1+2 /* 求二维数组

35、最小值及其位置 */ #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;iMinC

36、ol = 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列元素的

37、地址*/ 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 , &iS) ; for(i=0;i3;i+)f

38、or(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+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+) scan

39、f(“%f,pi+j); /* pi + j为为i行行j列元素的地址列元素的地址*/ fAvg += pij; /* pij表示表示aij*/ fAvg /=12; printf(The average of a = %fn,fAvg); 指针与字符串字符数组指针与字符串字符数组字符串在内存中可以存储为两种方式:字符串在内存中可以存储为两种方式:字符数组字符数组字符串常量字符串常量 可以使指针指向字符数组或字符串常量,经过指针援用字符数可以使指针指向字符数组或字符串常量,经过指针援用字符数组或字符串的各个字符。组或字符串的各个字符。1.指针与字符数组:指针与字符数组:char *chp,str

40、 =Hello!; /*阐明字符指针和字符数组阐明字符指针和字符数组*/chp=str; /*指针指向字符数组指针指向字符数组*/putchar( *(chp+2); /*经过指针援用数组元素经过指针援用数组元素*/2.指针与字符串:指针与字符串:char *strp; /*阐明字符指针阐明字符指针*/strp=“Hello!; /*指针指向字符串指针指向字符串*/puts(strp); /*经过指针援用字符串经过指针援用字符串*/阐明指针时,可以同时赋初值,如:阐明指针时,可以同时赋初值,如:char *strp=“Hello!;赋值表示将字符串的地址赋给指针!赋值表示将字符串的地址赋给指针

41、! /* 经过指针访问字符串常量 */ #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(vo

42、id) char str80, *chp; /* 阐明字符数组及指向字符的指针阐明字符数组及指向字符的指针 */ chp = str; /* 指针指向字符数组指针指向字符数组 */ gets(chp); while(*chp != 0) if(*chp = a & *chp = z) *chp -= 32;chp+; /* 指针指向下一字符指针指向下一字符 */ puts(str); 【例7】输入字符串,将其中小写字母转换成大写字符,其他的字符不变,输出结果。举例:将字符串中的大写字母转化对应的小写字母。#include void main(void) char *p,s80; p=s

43、; gets(p); for(;*p!=0;p+) if(*p=A&*p=Z) *p+=32; p=s; puts(p); 举例:将无符号的八进制字符串转换为十进制整数。#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数组。数组。输入字符串。输入字符串。sps5560n=0*8+5-05n=5*8+5-045n=45*8+6-0366指针数组和指向指针的指针 指针是存放其它数据对象地址的变量。因此,指针可以构成数指

44、针是存放其它数据对象地址的变量。因此,指针可以构成数组。每个数组元素为一个指针变量,且在内存中延续存放。组。每个数组元素为一个指针变量,且在内存中延续存放。指针数组的阐明指针数组的阐明阐明格式:阐明格式: 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+

45、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

46、=0;【例8】统计3行4列整型二维数组中正数的个数,并求正数的累加和,输出结果。 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); 指针数组的运用举例经过指针数组按数学方式输出数组的值。经过指针数组按数学方式输出数组的值。#include vo

温馨提示

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

评论

0/150

提交评论