c语言(第九章)指针讲义课件

PPT
  • 阅读 48 次
  • 下载 0 次
  • 页数 104 页
  • 大小 770.501 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
c语言(第九章)指针讲义课件
可在后台配置第一页与第二页中间广告代码
c语言(第九章)指针讲义课件
可在后台配置第二页与第三页中间广告代码
c语言(第九章)指针讲义课件
可在后台配置第三页与第四页中间广告代码
c语言(第九章)指针讲义课件
c语言(第九章)指针讲义课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 104
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
文本内容

【文档说明】c语言(第九章)指针讲义课件.ppt,共(104)页,770.501 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44466.html

以下为本文档部分文字说明:

1第九章指针29.1地址和指针的概念指针是C语言的一个重要概念,也是C语言的一个重要特色。深刻理解和正确使用指针是学习本章的基本要求。本章是一个难点,也是一个重点,初学者不易掌握。在理解和熟悉基本内容的前提下,上机实验是必不可少的

环节。39.1地址和指针的概念正确灵活的运用指针–可以有效表示复杂的数据结构–能动态分配内存–方便使用字符串–方便有效的使用数组–调用函数时可以得到多个值–能直接处理内存地址49.1地址和指针的概念数据在内存中是如何存取的?–例:在程序中定义了一个

变量,在编译时给这个变量分配内存单元,根据定义的变量类型,分配一定长度空间–内存中的每一个字节有一个编号,这就是地址,在地址所标志的内存单元中存放数据59.1地址和指针的概念一、地址在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(8位),它们都

有一个编号,这个编号就是内存地址。如下图所示:注意:1、程序中定义的每个数据在编译后都占有各自的内存区。2、数据所占有的存储单元个数是由其类型决定的。3、首地址:第1个单元的地址4、表示地址的数与整数的

区别69.1地址和指针的概念二、举例如有定义:charc=„A‟;inta=3;则所占内存情况如下:注意:c和a的地址可能相邻,也可能不相邻,是由系统分配的,我们不用关心。79.1地址和指针的概念三、直接访问和间接访问有两个上锁且放着物品的盒子A、B,如果你有A盒子的钥匙,则可

以直接打开A盒子将物品取出;如果你有B盒子的钥匙,而A盒子的钥匙在B盒子中,要想取出A盒子中的物品,则必须先打开B盒子,取出A盒子的钥匙,再打开A盒子将物品取出。上面两种情况就是直接访问和间接访问的概念。89.1地址和指针的概念1、直接访问通过变量

本身对变量进行存取的方式,称为直接访问。如定义:intx;则x=9;x+=5;等等这种访问方式只需要变量本身就得到了该变量的全部信息,不需要其它内容,是直接的。其实程序在经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。

99.1地址和指针的概念2、间接访问通过指针变量实现对变量的访问方式,称为间接访问。首先要定义一个指针变量,然后将一个同类型变量的地址赋给该指针变量(这时我们称指针变量指向该变量),这样就可以进行间接访问

了。间接访问的过程是:由指针变量得到变量的地址,根据该地址找到变量的存储区,再对该存储区的内容进行存取,从而实现了对变量的间接访问。109.1地址和指针的概念四、指针与指针变量1、指针:简单地说,指针就是地址。二者是同一个概念的两种说法。只不过指针更

形象一些,就像一个针一样,可以指向某个地方。2、指针变量:专门存放变量地址的变量。首先指针变量就是一个变量,和我们以前所讲的其它变量没有本质区别。不同之处在于这种变量中所存放的内容是地址。119.1地址和指针的概念指针与

指针变量关系指针变量变量变量地址(指针)变量值指向地址存入指针变量12变量的指针就是变量的地址,存放变量地址的变量是指针变量,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的关系,在程序中用*符号来表示“指向”指针变量不同于其他类型的变量,它专门用来

存放地址,必须将它定义为”指针类型“9.2变量的指针和指向变量的指针变量139.2变量的指针和指向变量的指针变量一、指针变量的定义和赋值1、格式:类型名*指针变量名;2、举例int*p1;char*s1,*s2;

float*a1,*a2,*f;3、说明a.类型名:指针变量所指向的变量类型。b.*是定义指针变量的标志,不可丢掉。c.指针变量定义后,其值是不确定的,可以通过赋值语句使一个指针变量指向一个整型变量14为什么要指定类型名–如果指针

指向的是一个整型变量,那么指针加1就意味着地址值两个字节,如果是指向一个实型变量,则增加的应该是4个字节,所以一个指针变量只能指向同一个类型的变量159.2变量的指针和指向变量的指针变量4、赋值:可以

进行初始化,也可以使用赋值语句(1)、初始化:inta,*s=&a;(2)、赋值语句inta,*s;s=&a;(3)、注意:只能用同类型变量的地址进行赋值!如定义:int*s;floatf;则s=&f;是非法的。16不定9.2变量的指针和指向变量的指针变量在分析有关指针的程序时,画

图是很好的方法:sa若有:inta=5,*s=&a;则不定5&a179.2变量的指针和指向变量的指针变量二、指针变量的引用1、两个运算符:&与*&:取地址运算符,注意与作位运算符时的不同(双目)*:取内

容,指针运算符。注意与作乘运算符时的不同(双目)2、说明a.&既可作用于一般变量,也可作用于指针变量b.*只能作用于指针变量c.定义指针变量时的*与该处的含义不同189.2变量的指针和指向变量的指针变量main(){inta,b;int*pointer_1,*pointer_2

;a=100;b=10;pointer_1=&a;pointer_2=&b;printf("%d,%d\n",a,b);printf("%d,%d\n",*pointer_1,*pointer_2);}199.2变量的指针和指向变量的指针变量如果有pointer_1=&a;(

1)&*pointer_1结果是变量a的地址,*pointer_1相当于变量a(2)pointer_2=&*pointer_1;结果pointer_2指向变量a&和*两个运算符的优先级相同,按自右而左方向结合(3)*&a等价于变量a(4)(*pointer_1)++相当于a++

209.2变量的指针和指向变量的指针变量3、指针变量可以进行的操作(1)赋值:inta,*p1=&a,*p2;p2=p1;(2)输出:printf(“%x”,p1);(3)增减:p1++;p2--;p1+=4;(4)取内容:*p1=5;a=5

;printf(“%d”,*p1);(5)比较:与指针常量NULL进行比较,两指针变量值的大小比较无意义。表示空指针,即不指向任何单元,在头文件stdio.h中定义。#defineNULL0219.2变量的指针和指向变量的指针变量例9.1#i

nclude<stdio.h>main(){inta1=11,a2=22;int*p1,*p2;p1=&a1;p2=&a2;printf(“%d,%d\n”,*p1,*p2);p2=p1;printf(“%d,%d\n”,*p1,*p2);}p1&a11122a1p2

a2&a2*p1*p2&a1229.2变量的指针和指向变量的指针变量例9.2#include<stdio.h>main(){inta1=11,a2=22;int*p1,*p2,*p;p1=&a1;p2=&a2;printf(“%d,%d\n”,*p1,*p2);p=p1;p1=p

2;p2=p;printf(“%d,%d\n”,*p1,*p2);}p1&a11122a1p2a2&a2*p1*p2&a1&a2239.2变量的指针和指向变量的指针变量例9.3#include<stdio.h>main(){inta1=11,a2=22,t;int*p1,*p2;p1=&a1;

p2=&a2;printf(“%d,%d\n”,a1,a2);t=*p1;*p1=*p2;*p2=t;printf(“%d,%d\n”,a1,a2);}p1&a11122a1p2a2&a2*p1*p22211t1

1249.2变量的指针和指向变量的指针变量例9.4#include<stdio.h>main(){inta1=3;int*p1;p1=&a1;printf(“%x\n”,p1);p1++;printf(“%x\n”,p1

);}a10000001100000000ffccffcdffceffcfp1p1++259.2变量的指针和指向变量的指针变量三、指针变量作为函数的参数1、定义形式:只需要形式参数名前加上一个*即可,作用是将变量的地址传递到另一

个函数中如:voidtest(int*pointer,charf,char*s)2、说明参数的传递是值传递,单向的(从实参到形参)。那么如何理解通过指针作为参数可以改变主调函数中变量的值呢?形参得到实参的值(一个地址),函数中可以通过形

参引用该地址,从而可以改变该地址对应变量的值。但如果形参本身改变了,其值不会传给实参。269.2变量的指针和指向变量的指针变量main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);pointe

r_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}swap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}运行结果;5,99

,527289.2变量的指针和指向变量的指针变量swap(int*p1,int*p2){int*temp;*temp=*p1;*p1=*p2;*p2=*temp;}因为*temp所指向的单元是不可预见

的,因此对*temp赋值可能会破坏系统的正常工作状况,应该将*p1的值赋给一个整型变量29swap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}main(){inta,b;int*pointer_1,*p

ointer_2;scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",*pointer_1,*pointer_2);

}30319.3指针与数组在C语言中,指针与数组有着密切的关系。对数组元素,既可以采用数组下标来引用,也可以通过指向数组元素的指针来引用。采用指针方法处理数组,可以产生代码长度小、运行速度快的程序。329.3指针与数组一、指向

数组元素的指针设有数组定义为:inta[5];则有:(1)a表示数组在内存中的首地址,也就是数组中第1个元素的首地址,它是一个地址常量,其值由系统在编译时确定,程序运行期间不能改变。(2)数组中的各元素表示为:a[0]、a[1

]、a[2]、a[3]、a[4]数组的指针是数组的起始地址a数组元素的指针是数组元数的地址&a[0]、&a[3]33inta[10];int*p;下面两个语句等价:p=&a[0];p=a;在定义的时候也可以赋初值int*p=&a[0];3

49.3指针与数组二、通过指针引用数组元素(1)数组中的各元素的地址表示为:&a[0]、&a[1]、&a[2]、&a[3]、&a[4]或者是:a+0(或a)、a+1、a+2、a+3、a+4(2)数组元数又可表示成

:*(a+0)(或*a)、*(a+1)、*(a+2)、*(a+3)、*(a+4)(3)数组的逻辑结构如下:a[0]a[1]a[2]a[3]a[4]a&a[0]&a[1]&a[2]&a[3]&a[4]35

9.3指针与数组现定义一个指针变量:int*s;并进行赋值:s=a;或s=&a[0];则,指针变量s指向了数组a的开始,二者产生了联系,这样就可以通过指针变量s访问数组a了。a[0]a[1]a[2]a[3]a[4]a&a[0]&a[1]&a[2]&a[3]

&a[4]s注意:a是指针常量,s是指针变量。369.3指针与数组当然,对s也可以进行其它赋值,如:s=a+2;或s=&a[2];图变为:a[0]a[1]a[2]a[3]a[4]a&a[0]&a[1]&a[2]&a[3]&a[4]s说明:若进行操作s=a;s+=2;

效果与上述相同。37说明:p+i和a+i就是a[i]的地址,他们都是指向a数组的第i+1个元素*(p+i)或*(a+i)是p+i或a+i所指向的数组元素指向数组的指针变量也可以带下标如:p[i]和*(p+i)是等价的389.3指针与数组

当一个指针变量指向数组的首地址后,关系图为:…数组inta[5]指向数组元素的指针int*s指向数组元素的访问a,&a[0],s,&s[0]a+1,&a[1],s+1,&s[1]a+i,&a[i],s+i,&s[i]a[0],*a,s[

0],*sa[1],*(a+1),s[1],*(s+1)a[i],*(a+i),s[i],*(s+i)399.3指针与数组总结:一维数组的访问例用多种方法访问一维数组各元素#include<stdio.h>main(){inta[5]={1,

3,5,7,9},i,*p=a;for(i=0;i<5;i++)printf(“%d”,a[i]);for(i=0;i<5;i++)printf(“%d”,*(a+i));for(i=0;i<5;i++)printf(“%d”,p[i

]);for(i=0;i<5;i++)printf(“%d”,*(p+i));for(;p<a+5;p++)printf(“%d”,*p);p=a;while(p<a+5)printf(“%d”,*p++);}409.3指针与数组几个表达式的分析设定义:inta[3]={1,2,3},*s

=a;(1)s,*sa,*a(2)s++,*s++,a++,*a++(3)*(s++),(*s)++*(a++),(*a)++指针变量可以实现本身的值改变,用p++使p的值不断变化,如果使用a++就不对了,a是数

组名,是数组的首地址,它的值在程序运行期间是固定不变的,是常量,因此a++是无法实现的41要注意指针变量的当前值,在使用指针变量指向数组的时候,应切实保证指向数组中有效的元素注意指针变量的运算:p++,使p指向下一个元素*p++,由于++和*同优先级,结合方向为自右而左,因此它等

价于*(p++),作用是先得到p指向的变量的值即*p,然后再使p+1=>p*(++p)使p加1,再取*p(*p)++表示p所指向的元素加1。是元素值加1,不是指针值加1429.3指针与数组三、用数组名作函数参数1、函数的定义形式例如:intfunc(in

tarray[],intn){函数体;}也可以写为:intfunc(int*pointer,intn){函数体;}439.3指针与数组2、函数的说明形式如有函数定义:intfunc(intarray[],intn){函数体;}则对该函

数的说明形式可以写为:intfunc(intarray[],intn);intfunc(int*array,intn);449.3指针与数组例编写在数组的最后一个元素中存放其它元素和的函数#include<stdio.h

>voidsummary(int*p,intn);main(){staticinta[11]={1,2,3,4,5,6,7,8,9,9};summary(a,9);printf(“Sumis%d\n”,a[9]);}voidsummary(int*p,intn){in

ts=0;while(n--)s+=*(p++);*p=s;}函数还可写为:voidsummary(intarr[],intn){inti,s=0;for(i=0;i<n;i++)s+=arr[i];arr[n]=s;}45例:将数组中n个整数按相反的顺序存放46main(){int

i,a[10]={3,7,9,11,0,6,7,5,4,2};printf(“Theoriginalarray:\n”);for(i=0;i<10;i++)printf(“%d,”,a[i]);printf(“\n”);inv(a,10);printf(“Thearrayha

sbeeninverted:\n”);for(i=0;i<10;i++)printf(“%d,”,a[i]);printf(“\n”);}47voidinv(intx[],intn)/*形参x为数组名*/{inttemp,i,j,m=(n-1)/2;

for(i=0;i<=m;i++){j=n-1-i;temp=x[i];x[i]=x[j];x[j]=temp;}}3791106754224576011973mij48voidinv(int*x,intn)/*形参x为指针变量*/{

int*p,temp,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i<=p;i++,j--){temp=*i;*i=*j;*j=temp;}}37911067542i,xp=x+mj49例:从10个数中找出其中的最大值和最小值–不要求改变数

组元素的值,只是找到最大和最小值,为了能得到两个结果,我们用两个全局变量在函数间传递数据50intmax,min;main(){voidmax_min_value(intarray[],intn);inti,number[10];printf

("enter10integernumber:\n");for(i=0;i<10;i++)scanf("%d",&number[i]);max_min_value(number,10);printf("\nm

ax=%d,min=%d\n",max,min);getch();}51voidmax_min_value(intarray[],intn){int*p,*array_end;array_end=array+n;

max=min=*array;for(p=array+1;p<array_end;p++)if(*p>max)max=*p;elseif(*p<min)min=*p;}相当于*(array+0)或array[0]……arrayp(开始)array_end52函数max_min_value的形参

array可以改为指针变量类型;voidmax_min_value(int*array,intn)实参也可以不用数组名,而用指针变量传递地址,形参仍用指针变量53intmax,min;voidmax_min_value(int*array,intn){int*p,*arra

y_end;array_end=array+n;max=min=*array;for(p=array+1;p<array_end;p++)if(*p>max)max=*p;elseif(*p<min)min=*p;}形参为指

针变量类型54main(){inti,number[10],*p;p=number;printf("enter10integernumbers:\n");for(i=0;i<10;i++,p++)scanf("%d",p);

printf("the10integernumbers:\n");for(p=number,i=0;i<10;i++,p++)printf("%d",*p);p=number;max_min_valu

e(p,10);printf("\nmax=%d,min=%d\n",max,min);getch();}实参为指针变量类型55总结:若一个实参数组,想在函数中改变此数组元素的值,实参和形参的表示形式有以下4种情况:56第

一种情况:形参和实参都用数组名:–形参和实参数组共用同一段内存单元main(){inta[10];…f(a,10);…}f(intx[],intn){…}57第二种情况:实参用数组名,形参用指针变量–通

过形参的变化就可以指向实参数组的任何一个元素main(){inta[10];…f(a,10);…}f(int*x,intn){…}58第三种情况:实参形参都用指针变量–传递指针变量的值,其实就是数组的首地址,通过形参指针的变化指向数组的任一元素,从而改变数组的值m

ain(){inta[10],*p;p=a;…f(p,10);…}f(int*x,intn){…}59第四种情况:实参为指针变量,形参为数组名–将数组的首地址传给形参指针,形参指针指向数组的首元素m

ain(){inta[10],*p;p=a;…f(p,10);…}f(intx[],intn){…}60以上的四种方法,实质上都是地址的传递,1和4只是形式上的不同,实质上都是使用的指针变量注意:如

果使用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的数组!如果不设数组,只设指针变量,就会出错。61选择法排序:main(){int*p,i,a[10];p=a;for(i=0;i<10;i++)scanf("%d",p++);p=

a;sort(p,10);for(p=a,i=0;i<10;i++){printf("%d",*p);p++;}getch();}62sort(intx[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=

i+1;j<n;j++)if(x[j]>x[k])k=j;if(k!=i){t=x[i];x[i]=x[k];x[k]=t;}}}用数组名作为形参,用下标法引用新参数组元素,63sort(int*x,intn){inti,j,k

,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(*(x+j)>*(x+k))k=j;if(k!=i){t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;}}}形参是指针变量64指向二维数

组的指针和指针变量一、多维数组的地址–inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};–a是一个数组名,a数组名包含3行,即三个元素:a[0],a[1],a[2].而每一个元素又是一个一维数组–a[0]:a[0][0]a[0][1]a[

0][2]–a[1]:a[1][0]a[1][1]a[1][2]–a[2]:a[2][0]a[2][1]a[2][2]65指向二维数组的指针和指针变量从二维数组的角度来看,a代表整个二维数组的地址,也就是0行的

首地址,a+1代表第1行的首地址,也就是a[1]的地址a[0]代表第0行一维数组第0列元素的地址,即&a[0][0],a[1]的值是&a[1][0]a[2]的值是&a[2][0]66指向二维数组的指针和指针变量第0行第

1列的元素的地址可以用a[0]+1来表示,这里的1代表1个列元素的字节数,即两个字节。即&a[0][1]67表示形式含义地址值&a指向二维数组的指针2000a二维数组名,指向a[0],第0行首地址2000a[0],*(a+0),*aa[0][

0]的地址2000a+1,&a[1]第1行首地址2008a[1],*(a+1)第1行第0列元素地址2008a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素的地址2012*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素的值元素值

1368指向二维数组的指针和指针变量二、指向多维数组的指针变量(1)指向数组元素的指针变量main(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int*p;for(p=a[0

];p<a[0]+12;p++){if(p-a[0])%4==0)printf(“\n”);printf(“%4d”,*p);}}69指向二维数组的指针和指针变量要输出某个指定的数组元素,a[1][2],则应事先计算该元素在数组中的相对位置,计算a[i][j]在数组中的相对

位置的计算公式:–i*m+j(其中m为二维数组的列数)–如果数组下标从1开始的话那么计算机公式就改为:–(i-1)*m+(j-1)70指向二维数组的指针和指针变量(2)指向由m个元素组成的一维数组的指针变量–p指向一个包含m个元素的一维数组,如果p先指向a[0]即p=&a[0],则p+

1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位71指向二维数组的指针和指针变量main(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int

(*p)[4],i,j;p=a;scanf(“i=%d,j=%d”,&i,&j);printf(“a[%d,%d]=%d\n”,i,j,*(*(p+i)+j));}729.4指针与字符串字符串是一种特殊的一维数组,所以上节中介绍的方法同样适用于对字符串的访问。字符串的特殊性在于:字符串

的末尾是结束标志‘\0‟,所以访问字符串时常用结束标志进行判断。739.4指针与字符串一、字符串指针作函数参数1、字符串结构的分析设有数组定义为:chars[]=“abcde”;则s是一个字符数组,它里面存放的是一个字符串。它在内存中占用6个字节,但长度为5。其结构为:„a‟„b‟„

c‟„d‟„e‟„\0‟ss[0]s[1]s[2]s[3]s[4]s[5]结束标志749.4指针与字符串字符串还可以定义为:char*s=“abcde”;它在内存中占用6个字节,长度为5。其结构为:„a‟„b‟„c

‟„d‟„e‟„\0‟ss[0]s[1]s[2]s[3]s[4]s[5]结束标志75说明程序在定义字符指针变量的时候,是把字符串的首地址(即存放字符串的字符数组的首地址)赋给ss作为一个指针变量,指向字符型数据,只能指向一个字符变量或其他字符类型数据,不能同时指向多个字符数据76说明

char*string;*string=“abc”;就是错误的,但可以string=“abc”;也可以char*string=“abc”;输出时:printf(“%s\n”,string);–字符指针变量名string,则系统先输出它所指向的一个字符数据,然后自动使str

ing加1,使之指向下一个字符,然后再输出一个字符…如此直到遇到字符串结束标志‘\n‟为止对于字符串种字符的存取,可以用下标方法,也可以用指针方法77例:例将字符数组a中的字符串拷贝到字符数组b中(1)下标法(2)指

针法#include<stdio.h>#include<stdio.h>main()main(){{chara[]=“Hello,world!”,b[20];chara[]=“Hello,world!”,b[20];inti;char*pa,*pb;for(i=0;a

[i]!=„\0‟;i++)for(pa=a,pb=b;*pa!=„\0‟;pa++,pb++)b[i]=a[i];*(b+i)=*(a+i);*pb=*pa;b[i]=„\0‟;*(b+i)=„\0‟;*pb=„\0‟;printf(“%s\

n”,b);printf(“%s\n”,b);}}789.4指针与字符串二、字符串指针作函数参数1、函数的定义形式例如:charfunc(chara[],charb[]){函数体;}也可以写为:cha

rfunc(char*a,char*b){函数体;}79例:设计一函数,实现与标准函数strcpy类似的功能。#include<stdio.h>voidmystrcpy(char*to,char*from);main(){charca[20],*cp=“Hello,wor

ld!”;mystrcpy(ca,cp);printf(“%s”,ca);}voidmystrcpy(char*to,char*from){while(*from!=„\0‟){*to=*from;to++;from++;}*to=„\0‟;}80while(*from

!=„\0‟){*to=*from;to++;from++;}while((*to=*from)!=„\0‟){to++;from++}while((*to++=*from++)!=0)while(*from!=„\0‟)*to++=*from++;while(*from)

*to++=*from++;while(*to++=*from++)for(;(*to++=*from++)!=0;)81也可以用指针变量(局部变量)voidcopy_string(charfrom[],charto[]){char*p1,*p2;p1=from;p2=to;w

hile((*p2++=*p1++)!=„\0‟);}82总结:实参形参数组名数组名数组名字符指针变量字符指针变量字符指针变量字符指针变量数组名839.4字符指针变量和字符数组字符数组由若干个元素组成,每个

元素种放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中84赋值方式对字符数组只能对各个元素赋值–如:charstr[14];–string=“IloveChina!”;是错误的而对字符指针变量,可以采用以下方法–如:char*a;–a=“Ilov

eChina!”;85对字符指针变量赋初值–char*a=“IloveChina!”;–等价于:–char*a;–a=“IloveChina!”;对数组的初始化–charstr[14]={“IloveChina!

”};–不能等价于:–charstr[14];–str[]=“IloveChina!”;–即数组可以在定义时整体赋初值,但不能在赋值语句中整体赋值86定义的字符数组,在编译时为它分配内存单元,它有确定的地址。定义指针变量时,给指针变量分配内存单元,

放一个地址值,该指针变量就指向一个字符型数据,charstr[10];scanf(“%s”,str);是可以的char*a;scanf(“%s”,a);不建议这样做char*a,str[10];a=str

;scanf(“%s”,a);87main(){char*a=“IloveChina!”;a=a+7;printf(“%s”,a);}指针变量的值是可以改变的charstr[]={“IloveChina!”};str=str+7;printf(“%s”,str)

;是错误的!数组名虽然代表地址,但是它的值是不能改变的88用指针变量指向一个格式字符串用指针变量指向一个格式字符串,用它代替printf函数中的格式字符串。char*format;format=“a=%d,b=%f\n”;printf(format,a,b);相当于:pri

ntf(“a=%d,b=%f\n”,a,b);也可以用字符数组来实现:charformat[]=“a=%d,b=%f\n”;printf(format,a,b);但由于不能采用赋值语句对数组整体赋值:charformat[];format=“a=%d,b=%d\n”;是

错误的899.5函数的指针和指向函数的指针变量一个函数在编译时被分配给一个入口地址,这个入口地址就称为函数的指针,可以用一个指针变量指向函数,然后通过该指针变量调用此函数909.5函数的指针和指向函数的指针变量main(){in

tmax(int,int);inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);}max(intx,inty){intz;if(x>y

)z=x;elsez=y;return(z);}919.5函数的指针和指向函数的指针变量每一个函数都有一个起始地址,可以用指针变量指向一个函数,通过指针变量来访问它所指向的函数main(){intmax(int,i

nt);int(*p)();inta,b,c;p=max;scanf(“%d,%d”,&a,&b);c=(*p)(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);}将函数max的入口地址赋给指针变量p调用函数max929.5函数的指针和指向函数的指针变量int(*p

)()定义p是一个指向函数的指针变量,此函数带回整型的返回值。注意:*p两侧的括弧不可省略,表示p先与*结合,是指针变量,然后再与后面的()结合,表示此指针变量指向函数939.5函数的指针和指向函数的指针变量说明:–指向函数的指针变量的

一般定义为:–数据类型(*指针变量名)();–函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)–(*p)()表示定义了个指向函数的指针变量,它不固定指向某个函数,在一个程序中,一个指针变量可

以先后指向不同的函数949.5函数的指针和指向函数的指针变量–在给函数指针变量赋值时,只需给出函数名而不必给出参数:因为是将函数的入口地址赋给指针变量,而不牵涉到实参和形参的结合问题–用函数指针调用函数,只需将(*p)代替函数名即可,在(*p)后的括弧中根据需要写上

实参。•c=(*p)(a,b);–对指向函数的指针变量,p+n,p++,p--,是无意义的959.6返回指针值的函数1、概念当函数的返回值是指针类型(地址)时,则称为指针函数。2、定义类型名*函数名(形参表){}如:int*f(inta);

等等。96例将一个字符串转换为大写形式并输出char*mytoupper(char*s){char*t=s;while(*t!=„\0‟){*t=(*t>=„a‟&&*t<=„z‟)?*t-32:*t;t+

+;}return(s);}main(){charps[80],*s;gets(ps);s=mytoupper(ps);puts(s);}9.5返回指针值的函数979.7指针数组与指向指针的指针一、指

针数组1、指针数组的概念指针数组是一种特殊的数组,它每个元素的类型都是指针类型(即地址),其它与一般数组相同。当把某个量的地址放入某元素中后,即可通过该元素对相应的量进行间接访问。2、指针数组的定义类型名*指针数组名[常量表达式];如:int*ap[3];c

har*s[9];等等。989.7指针数组与指向指针的指针3、指针数组的初始化(1)inta1[5],a2[5],a3[5],*ap[3]={a1,a2,a3};(2)char*sp[]={“abc”,“123”,“Hello”};4、指针数组的赋值上面的情况中,可以先定义变量,在进行赋

值,即(1)inta1[5],a2[5],a3[5],*ap[3];ap[0]=a1;ap[1]=a2;ap[2]=a3;(2)char*sp[]={“abc”,“123”,“Hello”};sp[0]=“abc”;sp[1]=“123”;sp[2]=“Hello”;99

例显示多个字符串main(){staticchar*ap[3]={“CPU”,“Computer”,“Microprocessor”};inti;for(i=0;i<3;i++)puts(ap[i]);}//以上用指针数组实现main(){staticcha

raa[3][15]={“CPU”,“Computer”,“Microprocessor”};inti;for(i=0;i<3;i++)puts(aa[i]);}//以上用二维字符数组实现9.7指针数组与指向指针的指针100两种方法中所占内存空间的比较CPU\0Computer\0Mi

croprocessor\0ap[0]ap[1]ap[2]aa[0]aa[1]aa[2]apCPU\0Computer\0Microprocessor\09.7指针数组与指向指针的指针1019.7指针数组与指向

指针的指针二、指向指针的指针2、多级指针的定义类型标识符**指针变量名;注:*的个数代表级数,要求掌握到二级即可。如:char**pp,*p,ch=„A‟;又p=&ch;pp=&p;则:1、多级指针的概念所谓多级指针,是指指针有多级指向关系。&p&ch„A‟pppch1029.7指针数组与指向指针

的指针3、多级指针的含义若定义:char*ps[]={“abc”,“123”},**pp=ps;则:*pp为“abc”*(pp+1)为“123”执行pp++;则:*pp为“123”103例显示并选择菜单条目#include<stdio.h>intgetchoice(c

har**menu,intn);main(){intchc;char*mn[5]={“1.Input”,“2.Copy”,“3.Move”,“4.Delete”,“0.Exit”};chc=getchoice(mn,5);if(chc>=0&&chc<5)printf(“YouchoiceNo.i

s%d\n”,chc);elseprintf(“Invalidchoice!\n”);}9.7指针数组与指向指针的指针104intgetchoice(char**menu,intn){inti,choic

e;for(i=0;i<n;i++)puts(*(menu+i));printf(\nInputypurchoice:”);return(getchar()-’0‟);}9.7指针数组与指向指针的指针

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?