第7章_指针-1(指针变量做参数、字符指针)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第7章指针指针是C语言的一个重要概念,也是C语言的重要特色。通过指针可以表示复杂的数据结构;实现动态分配内存;方便处理字符串;有效地访问数组;能带出函数的多个运算结果;能直接处理内存地址等。掌握指针的应用,可使程序简洁、紧凑、高效!不掌握指针就没掌握C的精华!第7章指针7.1指针概述7.2指针和数组间的关系7.3指针数组7.4带参数的main()函数7.5动态数组的实现7.1指针(Pointer)概述一、问题的提出-----为什么需要使用指针?例:编写函数实现两数的交换voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}#includestdio.hvoidSwap(intx,inty);intmain(void){inta,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);return0;}该程序能实现两数的交换吗?二、地址和指针的概念(一)内存单元的地址和其中的内容⒈内存单元的地址计算机的内部存储器是由若干个单元组成的,每一个单元中可存放一个字节的信息。为了能区分不同的单元,对这些单元分别编号,此编号即为内存单元的地址。…………FAC0FAC4FAC8内部存储器地址声明变量时必须理解变量名、类型、所占字节数、地址…2.指针及指针变量⑴指针(也叫变量的指针):在C中,将地址形象化地称为指针。一个变量的地址称为该变量的指针。⑵指针变量:在C中,有一种特殊的变量,它是专门用来存放另一个变量地址的变量,我们称它为指针变量。⑶指向(也叫指针所指变量):通过指针变量中的指针(地址)值所能找到的变量单元,称之为:地址“指向”变量单元(也叫指针所指变量)。inta=10,*p;p=&a;10&apa三、如何定义指针变量?⒈定义指针变量的一般形式类型标识符*指针变量名注意:(1)类型标识符用来说明指针变量能制向的变量类型,也叫指针的基类型;(2)“*”表示声明指针变量;指针变量名由用户指定。(3)指针变量是要分配存储空间的,大小为4字节,必须注意的是其中只能存放地址值,而不能存储一般的数据。例如:int*pointer_1,*pointer_2;(可以存放整型变量的地址)float*pointer_3;(可以存放实型变量的地址)char*pointer_4;(可以存放字符型变量的地址)指针变量能存放任意类型的地址吗?inti,*p;p=&i;int*p;float*q;p=q;inti;float*p;p=&i;inta=5,*p;p=a;指针变量只存放地址!一个指针变量不能指向与其类型不同的变量!我是正确的,你猜对了吗?应在类型相同的指针变量之间赋值2.&与*操作符&用来取变量的地址*用来访问指针变量所指向的内存中的数据(3)int*p,a[10];p=&a[0];*p=20;(4)int*p,a[10];p=&a[5];*p=20;(1)inti=3,*p;p=&i;printf(“*p=%d”,*p);(2)int*p,a[10];p=a;*p=20;printf(“a[0]=%d”,a[0]);例1:通过指针变量访问整型变量(在调试状态下查看各变量的值)#includestdio.hintmain(void){inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%d\n”,a,b);printf(“%x,%x\n”,p1,p2);printf(“%d,%d\n”,*p1,*p2);return0;}四、指针的运算(一)关系运算–指向同一种数据类型的两个指针变量才能进行关系运算–值为1(真)或0(假)–pqpqp==q注意:是判断地址的大小,而绝对不是数据值的大小。–不能与非指针类型变量进行比较,但可与NULL(为指针常量,即空(0)值)进行等或不等的关系运算–判断p是否为空指针–P==NULL–p!=NULL(二)赋值运算1.指针变量的赋值——赋地址指针变量在使用前一定要赋值;为指针变量赋的值必须是一个地址。intmain(void){int*p;scanf(%d,p);…}intmain(void){inta,*p=&a;scanf(%d,p);…}错!但TC下不报错VC下报错例如:理解如下指针变量的赋值结果:intmain(void){inta=10,b=20,*p,*q;p=&a;/*使指针变量p指向变量a*/q=&b;/*使指针变量q指向变量b*/p=q;/*使p指针变量获得指针变量q中的地址*//*或者q=p;*/printf(“a=%db=%d\n”,a,b);printf(“a=%db=%d\n”,*p,*q);return0;}2.指针所指变量的赋值——赋数据格式:*指针变量名=数据值|表达式例如:intmain(void){inta,b,*p,*q;p=&a;/*使指针变量p指向变量a*/q=&b;/*使指针变量q指向变量b*/*p=10;/*给p指针所指变量a赋值为10*/*q=*p+20;/*给q指针所指变量b赋值为30*/printf(“a=%db=%d\n”,a,b);return0;}五、指针变量作为函数参数函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传到另一个函数中____单向传址。1、函数的声明形式:函数结果类型名函数名(类型名*指针变量){函数体语句部分;}注意:函数的形参为指针类型,它用来接受函数调用时对应实参的地址。2、函数的调用形式:函数名(指针变量名|&变量名)注意:实参数必须是变量的地址值或指针变量。例如:指针作函数参数的简单形式#includestdio.hvoidf(double*p);intmain(void){doublex1;…f(&x1);/*调用函数时实参为变量地址*/…}voidf(double*p)/*函数的形式参数为指针变量*/{…}x1指针变量pFFC0形参指针变量p指向实参变量x1voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}intmain(void){inta,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);return0;}voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}intmain(void){inta,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);return0;}程序1程序2例1:编写函数实现两数的互换主调函数被调函数实参形参结果有何不同?主调函数被调函数intmain(void){inta,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);return0;}voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}15ab实参形参8程序1xytemp实参传值给形参主调函数被调函数intmain(void){inta,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);}voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}&a实参形参&b程序2xytempab815实参传地址给形参形参和实参为同一单元例2:利用指针变量将函数的多个运算结果带出函数__这是指针最重要的应用!如定义一个根据圆的半径,计算该圆的直径、周长和面积的函数,然后调用该函数。#includestdio.h#definePI3.1415926doubleCircle(doubler,double*c1,double*s1);intmain(void){doubler,ll,cc,ss;printf(Pleaseinputrdata:);scanf(%lf,&r);ll=Circle(r,&cc,&ss);printf(l=%.2fc=%.2fs=%.2f\n,ll,cc,ss);return0;}DoubleCircle(doubler,double*c1,double*s1){doublel1;l1=2*r;*c1=2*PI*r;*s1=PI*r*r;returnl1;}注意:该函数计算的圆直径值是用return字句带出函数的,而圆的周长和面积值是通过指针带出函数的!swap函数的几种错误形式(1/2)参数单向传递#includestdio.hvoidSwap(int*p1,int*p2);intmain(void){inta,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);return0;}voidSwap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}为什么是错的呢?它到底交换的是啥?swap函数的几种错误形式(2/2)指针p没有确切的地址#includestdio.hvoidSwap(int*p1,int*p2);intmain(void){inta,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);}voidSwap(int*p1,int*p2){int*p;*p=*p1;*p1=*p2;*p2=*p;}它又交换的是啥东东呢?voidsub1(chara,charb){charc;c=a;a=b;b=c;}voidsub2(char*a,charb){charc;c=*a;*a=b;b=c;}voidsub3(char*a,char*b){charc;c=*a;*a=*b;*b=c;}以下程序的输出结果是()。#includestdio.hvoidsub1(chara,charb);voidsub2(char*a,charb);voidsub3(char*a,char*b);intmain(void){chara,b;a=‘A’;b=‘B’;sub3(&a,&b);putchar(a);putchar(b);a=‘A’;b=‘B’;sub2(&a,b);putchar(a);putchar(b);a=‘A’;b=‘B’;sub1(a,b);putchar(a);putchar(b);return0;}六、字符指针作为函数参数(一)串的表示:字符数组或字符指针C语言并没有为字符串提供任何专门的表示法,完全是使用字符数组和字符指针来处理字符串。字符串–一串以'\0'结尾的字符字符数组–每个元素都是字符类型的数组charstring[100];字符指针–指向字符类型的指针char*p;(二)字符指针变量与字符数组的区别1、定义方法不同charstr[10];char*ptr;2、赋值方法不同charstr[10];str=”china”;/*错误*/strcpy(str,”china”);/*正确*/char*ptr;ptr=”china”;(三)使用字符指针的注意事项字符指针变量必须有明确的指向,否则使用是危险的。(思考:为什么呢?)例如,输入字符串时char*a;scanf(%s,a);/*错误*/应为:char*a;charstr[10];a=str;scanf(%s,a);/*正确*/#includestdio.hvoidMyStrcpy(char*p2,constchar*p1){while(*p1!='\0'){*p2=*p1;p1++;p2++;}*p2='\0';}例1:字符串拷贝——用字符指针编程intmain(void){chara[80],b[80];printf(“Pleaseenterastring:”);gets(a);MyStrcpy(b,a);printf(“Thecopyis:”);puts(b);return0;}cat\0aa[6]a[5]a[4]

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功