《C语言程序设计基础》课件-指针_第1页
《C语言程序设计基础》课件-指针_第2页
《C语言程序设计基础》课件-指针_第3页
《C语言程序设计基础》课件-指针_第4页
《C语言程序设计基础》课件-指针_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第8章指针[知识导读]

指针是C语言非常重要的一种数据类型,同时也是C语言的一个重要特色。利用指针变量可以表示各种数据结构,能够很方便地操作数组和字符串。本章主要通过几个具体任务引出了指针的基本概念,包括指针变量的定义、引用,指针与数组的关系(包括指针与一维和二维数组的关系、指针与字符串的关系等),指针与函数的关系等。任务设置任务

1从键盘输入N个整数,将它们按照输入时的顺序逆序排列后输出;1任务闰年判断

[任务目标]

掌握地址、指针与指针变量的概念;理解变量、数组指针的概念;掌握指向变量、一维数组的指针变量的定义与引用方法;了解多级指针的概念;掌握指针变量作为函数参数时的传递内容和过程。任务[任务描述]首先从键盘输入N个数据,输入数据之后,直接在屏幕上显示出逆序之后的数据。例如:从键盘输入:12345678910,则逆序后的数据序列为:10987654321。任务[任务分析]首先设置一个长度合适的数组a[N]来存放这N个数据。数组元素的逆序算法比较简单,其核心思路为:先将第一个元素和最后一个元素交换(也即a[0]和a[N-1]),然后再交换第二个元素和倒数第二个元素,再交换第三个和倒数第三个元素……以此类推,直到交换到最中间的两个元素。任务第一种做法是设置两个下标i和j,分别对应数组的第一个元素和最后一个元素,只要i<j,就交换a[i]和a[j],然后修改下标,使i加1、j减1,使它们分别对应数组的第二个元素和倒数第二个元素,后面的操作依次类推,直到i等于j或大于j为止。第二种做法是设置两个指针变量p和q,分别指向数组的第一个元素和最后一个元素,只要p<q,就交换*p和*q,然后修改p和q,使P++和q--,使它们分别指向数组的第二个元素和倒数第二个元素,后面的操作依次类推,直到p等于q或大于q为止。

8.1指针概念及基本操作相关知识8.1.1指针与指针变量1、指针的概念1)内存和地址在计算机中,为了正确的访问这些内存单元,就必须为每个内存单元编号,根据一个内存单元的编号就可以很快找到这个内存单元。这个内存单元的编号,我们称为地址。地址也必须是唯一的。

20002001200220032004地址内容3031002052)地址和内容为了提高程序的方便性,在C语言或其他高级语言可以通过给出变量名来访问内存单元的。如:inta=3;执行这条语句,实际上有2步操作,在系统编译时会首先给a变量在内存中分配2个内存单元,然后再将3这个值存储在分配好的内存单元中。20302031a的地址变量a03003)变量地址的获取C语言中为我们提供了一个专用的运算符:取地址运算符&

例如:inta;scanf(“%d”,&a);4)指针和指针变量指针只是地址的另外一个名称。专门存放别的变量(或其他程序实体)的地址,这种变量称为指针变量。p=&a;则变量p和a有如下对应关系:变量p中存储的是a的地址,也即p指向a。p和a的关系如下图所示。p变量a变量2030300020303a的地址p的地址2、指针变量的定义与引用1)指针变量的定义指针变量定义的一般形式为:类型说明*变量名;例如:int*p;注意:指针变量的类型实际上是指针变量所指向对象的类型,比如float*p1;char*p3;一个指针变量只能指向同一类型的变量。定义指针变量时,指针变量名前面的“*”是指针标志,与取内容运算符“*”相区别。2)指针变量的初始化两种方式:inta=3;int*p;p=&a;或者inta=3;int*p=&a;注意:a变量须在指针变量定义之前定义。指针变量在初始化之前不能使用,也即未经赋值的指针变量不能使用,否则将造成系统混乱。也有的C语言教材中把没有赋值的指针变量称为野指针。可以采用空指针(NULL)。使用方法为p=NULL;只能用地址值给指针变量赋值,不允许赋予其它类型数据。3)指针变量的引用取地址运算符&和取内容运算符*&

取地址运算符,功能是获取变量的内存地址。*取内容运算符,和指针变量配合使用,表示指针变量所指向的变量。例如:inta=4,*p;p=&a;printf(“%d”,*p);在本例中,*p和a等价,因此输出*p的值,也即是输出a的值。【说明】&运算符和*运算符是互逆运算符,因此*(&a)==a,&(*p)==p。【例1】利用不同的方式访问内存单元。#include<stdio.h>main(){intx,y,*p,*q;p=&x;q=&y;x=4;y=5;/*对变量x和y的直接访问*/printf("x的地址是%x\n",&x);/*以十六进制显示变量x和y的内存地址*/

printf("y的地址是%x\n",&y);printf("x=%d,y=%d\n",x,y);/*显示变量x和y的内容*/printf("-----------------\n");/*对变量x和y的间接访问*/printf("p的地址是%x\n",&x);/*以十六进制显示指针变量p和q的内存地址*/printf("q的地址是%x\n",&y);printf("p=%x,q=%x\n",p,q);/*显示变量p和q的内容*/printf("*p=%d,*q=%d\n",*p,*q);/*显示变量p和q分别指向的变量的内容*/}【例2】从键盘输入两个整数a和b,按从小到大的顺序将a,b输出,要求利用指针来操作。也即是:将小数存放到a中,大数放在b中,最后按顺序输出a,b的值就可以实现要求。方法一:#include<stdio.h>main(){inta,b,*p1,*p2,t;p1=&a;p2=&b;printf("请输入两个整数:\n");scanf("%d,%d",p1,p2);/*利用指针变量输入a、b的值*/if(a>b){t=*p1;*p1=*p2;*p2=t;}/*利用指针变量的指向操作交换a、b的值*/

printf("a=%d,b=%d\n",a,b);}&ap199&b100p2abt132&ap1100&b99100p2abt方法二:#include<stdio.h>main(){inta,b,*p1,*p2,*p;p1=&a;p2=&b;printf("请输入两个整数:\n");scanf("%d,%d",p1,p2);/*利用指针变量输入a、b的值*/if(*p1>*p2){p=p1;p1=p2;p2=p;}/*交换指针变量p1、p2的指向*/printf("a=%d,b=%d\n",*p1,*p2);/*利用指针变量p1和p2间接访问*/}100a&b99&abp1p2p132100a&a9&b&abp1p2p【思考】如果将方法二中的if(*p1>*p2){p=p1;p1=p2;p2=p;}改为:if(*p1>*p2){*p=*p1;*p1=*p2;*p2=*p;}结果将会怎样?还能否实现题目要求?3、指针变量作为函数参数【例3】实现功能同【例2】,要求用函数调用实现交换变量的值。#include<stdio.h>voidswap(int*p1,int*p2){intt;t=*p1;*p1=*p2;*p2=t;/*利用指针变量的指向操作交换a、b的值*/}main(){inta,b;printf("请输入两个整数:\n");scanf("%d%d",&a,&b);if(a>b)swap(&a,&b);

printf("a=%d,b=%d\n",a,b);}多级指针的概念1.二级指针

&p&x65qpx二级指针变量的定义形式为:二级指针变量一级指针变量普通变量类型**指针变量名;

普通变量、一级指针变量、二级指针变量也可以在一道定义。例如:

int**q,*p,x;

二级指针变量赋值方法:①初始化赋值;②在执行部分赋值,或者赋给它另一个同类型二级指针变量的值

注意1.一级指针变量只能取得普通变量的地址,二级指针变量只能取得一级指针变量的地址,当然都不能用整数给它们赋值

2.printf(“x=%d”,**q);就相当于语句

printf("x=%d",x);一样4.综上,引用普通变量x共有三种方法:

x

/*直接引用*/

*p

/*间接引用*/

**q

/*间接引用*/

当然,后两种方法的前提是:指针变量都取得了相应的地址值。3.**q==*(*q)==*p==x。【例4】main(){int*p1,**p2,***p3,****p4,x=10;p1=&x;

p2=&p1;

p3=&p2;

p4=&p3;printf("x=%d\n",****p4);}程序运行的结果如图所示:运行下面的程序1、通过指针访问数组元素1)指向数组元素的指针例如inta[5];int*p;p=&a[0];所以上例的语句可写成:inta[5];int*p=a;在本例中的语句int*p=a;和int*p=&a[0];完全等价,因为数组名a等价与&a[0]。

用指针处理数组2)指向数组的指针如果定义:inta[10];int*p=a;那么,p+1则指向同一数组中的下一个元素。a[0]a[1]a[2]a[3]a数组pp+1p+2…….p+ia[9]a[i]aa+1a+2a+ia+9p+9*(p+i)【例5】采用下标法输出数组中全部元素。#include<stdio.h>main(){inta[10],i;

printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(i=0;i<10;i++)printf("%d",a[i]);/*下标法输出*/printf("\n");}【例6】采用地址法输出数组中全部元素。#include<stdio.h>main(){inta[10],i;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",a+i);printf("\n");for(i=0;i<10;i++)printf("%d",*(a+i));/*地址法输出*/printf("\n");}【例8】采用指针变量法输出数组中全部元素(指针移动)#include<stdio.h>main(){inta[10],*p;printf("请输入10个整数:\n");for(p=a;p<a+10;p++)scanf("%d",p);printf("\n");for(p=a;p<a+10;p++)printf("%d",*p);/*指针变量法输出,移动指针*/printf("\n");}【例9】采用指针变量法输出数组中全部元素(指针不移动)。#include<stdio.h>main(){inta[10],i,*p=a;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(i=0;i<10;i++)printf("%d",*(p+i));/*指针变量法输出,指针不移动*/printf("\n");}实参形参数组名数组数组名指针指针数组指针指针2、数组名作为函数参数由于数组名代表数组的首地址,所以数组名作为函数参数的传递方式是地址传递。数组作为函数参数有4种形式:[任务实施]1、程序清单参考程序一:#include<stdio.h>#defineN10voidchange(intb[],intn){inti=0,j=n-1;inttemp;while(i<j){temp=b[i];b[i]=b[j];

b[j]=temp;i++;j--;}}main(){inta[N],i;printf("Pleaseinput%dnumbers:",N);for(i=0;i<N;i++)scanf("%d",&a[i]);

change(a,N);printf("\nThearrayhasbeeninvertedis:\n");for(i=0;i<N;i++)printf("%d",a[i]);printf("\n");}参考程序二:#include<stdio.h>#defineN10voidchange(int

*p,intn){int*q=p+n-1;inttemp;while(i<j){temp=*p;*p=*q;*q=temp;p++;q--;}}main(){inta[N],i;printf("Pleaseinput%dnumbers:",N);for(i=0;i<N;i++)scanf("%d",&a[i]);

change(a,N);printf("\nThearrayhasbeeninvertedis:\n");for(i=0;i<N;i++)printf("%d",a[i]);printf("\n");}

指针与字符串1、用指针访问字符串的方法在C语言中,字符串中的字符存储都是连续存放的,并且最后一个字符时’\0’字符。因为有这样两个特点,所以,我们可以用字符型指针变量访问并操作字符串和字符数组。因为要逐个检查字符,用字符数组比较方便,程序如下:/*EX8-13.C*/#include<stdio.h>main(){charstr[80],*ps=str;inti;printf("Inputastring:\n");gets(ps);

/*用字符型指针变量输入字符串*/for(i=0;str[i]!='\0';i++)

if(str[i]=='k')break;

/*查找第一个'k'的位置*/if(str[i]!='\0')printf("\'k\'is%dthcharacter.\n",i+1);elseprintf("Thereisno\'k\'inthestring.\n");}【例10】在输入的字符串中查找是否有字符'k',若有指出第一次遇到的'k'是第几个字符。【例11】利用指针统计出字符串中字符的个数。#include<stdio.h>#include<string.h>#defineN30main(){charsn[N];char*ps=sn;/*字符指针变量ps指向字符数组sn*/intlen=0;/*统计字符个数的计数器置0*/printf("请输入一串字符:");gets(sn);/*输入字符串存入sn*/while(*ps!='\0')/*字符串结束标志'\0'作为循环判断条件*/{len++;/*每找出一个字符,len加1*/ps++;/*ps指向下一个字符*/}ps=sn;/*ps重新指向字符串开头*/printf("字符串\"%s\"的长度是:%d\n\n",ps,len);}指针数组1.指针数组的概念和定义

由指向同一数据类型数据的指针为元素组成的数组叫指针数组。一维指针数组的定义形式为:

类型*数组名[元素

温馨提示

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

最新文档

评论

0/150

提交评论