《指针与数组》PPT课件.ppt_第1页
《指针与数组》PPT课件.ppt_第2页
《指针与数组》PPT课件.ppt_第3页
《指针与数组》PPT课件.ppt_第4页
《指针与数组》PPT课件.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

实验15 指针概念及应用,15.2.1 变量与内存单元,1. 指针、地址、内存单元 内存由很多内存单元组成,这些内存单元都是用来存放数据的。 每个内存单元都有一个编号,称为地址。 由于通过地址可以找到对应的内存单元,也就是说一个地址“指向”它所对应的内存单元,因此地址被形象化地称为“指针”。,2. 变量与变量的地址,变量代表了一个内存单元,是用来存放数据的。 假如用下面两个语句定义了两个变量x和c: float x; int c; 那么x、c都代表内存单元,分别用来存放一个单精度实型数和一个整型数。,main() float x; int y; ,变量的内容,变量的地址,由于变量代表内存单元,因此变量有地址。,变量的地址用求地址运算符“&”求出。 如变量x的地址是&x,变量c的地址是&c。 变量定义后在使用过程中不再重新分配内存单元,这个过程中变量的地址是一个常量。,15.2.2 指针变量,1. 指针变量的定义 变量是内存单元,不同类型的变量可以存放不同类型的数据,如整型变量可以存放一个整型数,实型变量可以存放一个实型数。 那么有没有一种变量可以存放一个地址(指针)呢? 这种变量就称为指针变量。 指针变量的定义格式: 类型名 *变量名;,如下语句定义了两个指针变量pt1和pt2。 int *pt1; /* 定义了指针变量pt1,其值是一个整型变量的地址 */ float *pt2; /* 定义了指针变量pt2,其值是一个实型变量的地址 */ 注意:这里定义的指针变量是pt1和pt2,而不是*pt1和*pt2。,2. 指针变量的赋值与初始化,指针变量的值是指针,因此只能将指针赋值给指针变量。如: int x,*p1; /* 此语句定义了2个变量:x、 p1, 其中p1是指针变量。 */ char a,*p2; /* 此语句定义了2个变量:a、 p2, 其中p2是指针变量。 */ p1= /* 将a的地址赋给p2 */,注意不能这样赋值:p2= 为什么? 因为p2的值只能是字符型变量的地址。,指针变量的初始化就是在定义变量的同时给变量一个初始值。 如int x, *p= 注意这里&x赋给p而不是*p */,15.2.3 指针的指向,1. 指针变量的值与指针变量的指向 如果指针变量p的值是 /* p的值改成&y,因而p也指向了y */,2. 指向运算,指向运算用运算符“*”表示,其格式为: *指针变量 以上表示“指针变量所指向的变量”。假如p是指针变量,那么*p就是p指向的变量。当p的值是&a,即p指向a时,*p就是a。,5,3,2004,a和b相加的结果(*p=a+b)存放到变量p所指向的内存单元中去。此时c称为指针变量p的目标变量。,p=&c,8,main() int a=5,b=3,c,*p; p = ,变量的地址称为变量的指针 存放地址的变量称为指针变量,3. 运算符“*”的三种含义,C语言中运算符“*”在不同的地方表示不同的含义:(1)“*”的位置在两个量的中间,表示“相乘”。 如:a*b 2*x+1 (2)“*”出现在变量定义语句或函数的形参列表中,表示变量是指针类型。 如:int *x; /* 表示x是指针类型 */ void fun(int *u)函数体/*表示u是指针类型 */ (3)“*”的位置在一个变量的前面(但不是(2)的情况),表示指向运算。 如:*x=5; b=*t; (*u)+; printf(“%d“,*p);,15.2.4 指针与数组,1. 数组的指针表示 C语言规定,数组名代表了数组的首地址,是数组首个元素的地址,它是一个常量。换言之,数组名是一个指针,指向数组的第一个元素。 如 int x20; 那么x就是&x0, *x就是x0。,c语言中还规定:如果某个指针p指向数组的某个元素,则p+1指向数组的下一个元素。 由此得出:假如x是数组名, x+i就是&xi, *(x+i)就是xi。事实上,在C语言中,xi就是处理成 *(x+i) 进行运算的。,2. 用指针变量指向数组元素 可以定义指针变量指向数组元素。如: float x10; float *p; p=x; /* p指向x0 */ p=x+2; /* p指向x2 */ p+; /* p指向x3 */,可以使用指针变量代替下标访问所有数组元素,如 float x10; float *p; for(p=x;p=p+9;p+)scanf(“%f“,p); /* 输入每个元素 */ for(p=x;p=p+9;p+)printf(“%ft“,*p); /* 输出每个元素 */,15.2.5 指针与字符串,1. 字符串的指针表示 字符串存放在字符型数组中,可以象数组一样用指针的形式访问字符串中的字符。假如有: char str20=“visualc+“; 那么,str是字符串的首地址,*str就是str0,即字符串中的首字符v; *(str+2)就是str2,即字符s。,2. 使用指针变量指向字符串中的字符 与数组类似,使用指针变量可以方便访问字符串中的字符,如: char str20=“visualc+“; char *p; p=str; /* p指向字符串中的首字符v */ p+; /* 指针往后移动一个位置,指向第二个字符 */ p-; /* 指针往前移动一个位置 */,3. 使用指针变量代替下标遍历字符串 下面给出使用指针变量遍历字符串中每个字符的方法,如 char x10=“abcd“; char *p; for(p=x; *p!=0;p+)printf(“%ct“,*p); /* 输出每个字符 */,4. 关于字符串的若干提法 字符串是指以0结束的一串字符,我们可用字符型数组来存放字符串,也可以用一个指针变量指向字符串。如: char x30=“abcd“, *p; p=x;,这时字符串“abcd“有如下几种提法: (1)由于“abcd“存放在数组x中,因此被称为“存放在x中的字符串”; (2)由于数组名x就是首地址,指向字符串“abcd“的首字符,因此“abcd“也是“指针x指向的字符串”; (3)p也指向字符串“abcd”的首字符,因此“abcd”也是“指针p指向的字符串”。 习惯上,“指针x指向的字符串”常被简称为“字符串x”。在后面描述中,如果遇到“字符串s”的名称实际上就是“指针s指向的字符串”。,5. 字符指针被看成是字符串*,如上所述,“字符指针p”可以看成是“p所指的字符串”,也就是说,一个指针可以当成字符串使用。如: char *p=“abcd“; /* 定义指针变量指向“abcd“的第一个字符 */ gets(p); /* 输入一个字符串,放入以p为首地址的内存空间中 */ p3=w; /* 改变一个字符,相当于*(p+3)=w */ printf(“%s“,p); /*输出以p为首地址的字符串 */ 说明:上述第一个语句说明p是一个指针变量,指向字符串“abcd“。但后面的3个语句都把p当成字符串使用。,又如: char ss30=“abcdefgh“, *p; p=ss+3; /* p指向字符d */ printf(“%sn“, ss);/* 输出ss所指的字符串 */ printf(“%sn“, p); /* 这里p被看成是字符串,输出p所指的字符串 */ 其运行结果:,此例也把指针p当成字符串进行输出,但输出的不是原先的整个字符串,而是p所指的字符开始的字符串。在这里我们可以再次体会“p所指的字符串”的真正含义。 指针可以当成字符串使用,体现了C语言中字符指针在使用上的灵活性。但是不能用字符指针完全代替字符型数组,其原因是字符指针不一定指向字符串所在的空间,或者指针所指的字符串空间可能不够,因此初学者要小心使用。,15.3编程范例,例1 使用指针间接访问变量。定义一个指针变量p和两个整型变量a、b,不对a、b直接赋值,利用p使得a、b的值分别是100、200,输出a、b的值。 例2 利用指针代替下标进行数组编程:从键盘输入8个整数放入数组,然后将每个奇数加1,每个偶数减1,最后输出数组的所有元素。 例3 使用指针代替下标编程:输入一个字符串,将最后一个字符变为与第一个字符交换。,练习题:,1、执行下面的程序段后,ab的值为( )。 (A)220(B)210(C)200(D)190 int *var, ab; ab = 200 ; var = (D)*pb = *x,B A,3、以下程序的输出结果是( ) (A)1 (B)1 (C)16 (D)1 main() int *p = a , a10=11,12,13,14,15,16,17,18,19,10; printf(“%dn”,*(p+5) ); ,C,4、下面程序的输出结果是 A) 11; B) 12; C)19; D) 20; main() int a=11,12,13,14,15,16,17,18,19,20,*p; p=a; printf(”%dn”,*p+9); ,D,5、若有以下定义,则对a数组元素的正确引用是_。int a5,*p=a; A)* A)元素x5的地址 B)元素x5的值 C)元素x6的地址 D)元素x6的值,D A,7、有以下程序 main() char a=“programming“, b=“language“; char *p1,*p2; int i; p1=a; p2=b; for(i=0;i7;i+) if(*(p1+i)=*(p2+i) printf(“c“,*(p1+i); 输出结果是_。 A) gm B) rg C) or D) ga,D,以下函数功能是把两个整数指针所指向的存储单元中的内容进行交换。请填空。 exchange(int *x, int *y) int t; t=*y;*y=_;*x=_; ,*x t,下面程序利用指向一维数组的指针变量输出下标为3的整数倍的数据,有3处错误,请改正。 main ( ) int x9=0, 1, 2, 3, 4, 5, 6, 7, 8, 9 int *p; for (p=x; px+9; p+1) if (p-x) % 3 = 0) printf (“%2d”, p); printf (“n”); ,x9应改为x10 for(p=x;px+10; p+) printf (“%2d”, *p);,15-10 编写程序,输入一个字符串,统计字符串中与最后一个字符相同的字符有几个。要求使用指针代替下标进行编程。,#include main() char x30, *p,t;int count=0; gets(x); for(p=x;*p!=0;p+); p- ; t=*p; for(p=x;*p!=0;p+) if(*p=t )count+; printf(“%d“,count); ,15-11 以下程序的功能是先求一个数组的最大元素的指针pmax,然后将最大元素与最后一个元素互换,最后输出互换后的数组元素。,main() int a10=5, 6, 2, 5, 89, 4, 6, 21, 46, 16, *p, *pmax, temp; *pmax=*a; for (p=a;p*pmax) pmax=p; for (p=a;pa+10;p+); p-; temp=*pmax;*pmax=*p;*p=temp; for (p=a;pa+10;p+) printf(“%d “,*p); ,15-12 使用指针代替下标编写程序,输入一个字符串s1,将其复制到s2和s3中,然后把s2中的大写字母变成空格,把s3中的小写字母变成空格,输出3个字符串。要求使用指针代替下标进行编程。,main() char s130, s230,s330,*p,*q1,*q2; gets(s1); for(p=s1,q1=s2,q2=s3;*p!=0;p+,q1+,q2+) *q1=*p; *q2=*p; *q1=0; *q2=0; for(q1=

温馨提示

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

评论

0/150

提交评论