C语言程序设计教程(第三版)(微课版)课件 第5章 指针_第1页
C语言程序设计教程(第三版)(微课版)课件 第5章 指针_第2页
C语言程序设计教程(第三版)(微课版)课件 第5章 指针_第3页
C语言程序设计教程(第三版)(微课版)课件 第5章 指针_第4页
C语言程序设计教程(第三版)(微课版)课件 第5章 指针_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础(C)主讲:王娟勤西北农林科技大学信息工程学院地址指针和指针变量5.1指针与一维数组5.2指针与二维数组5.3第5章指针指针与字符串5.4指针数组5.5

内存存放了计算机正在运行的程序和程序正在使用的数据。内存的基本单元是字节(Byte)。

为了访问内存单元,CPU给每个内存单元一个编号,该编号称为该内存单元的地址。

变量是程序中可以改变的量,当说明变量时,系统将为其在内存中开辟相应的内存单元。由此确定变量的地址及内存中的表示方式。2000H2001H2002H2003Hinta=0;a的内存单元a的地址&a

如果有一变量p,其内容存放了a的地址&a,通过p也可实现对a的访问,p称为指针变量。00H20Hp00005.1指针和指针变量变量与地址00H00H…...…...2000200820122010整型变量i10变量i_pointer200220042006指针与指针变量指针:就是地址指针变量:专门存放地址的变量叫~2000指针指针变量

变量的内容

变量的地址5.1指针和指针变量指针与指针变量指针:一个变量的地址指针变量:专门存放变量地址的变量叫~指针变量变量变量地址(指针)变量值指向地址存入指针变量5.1指针和指针变量&与*运算符含义含义:取变量的地址单目运算符优先级:2结合性:自右向左含义:

间接寻址运算符单目运算符优先级:2结合性:自右向左两者关系:互为逆运算理解i_pointer-----指针变量,它的内容是地址*i_pointer----指针的目标变量,它的内容是数据&i_pointer---指针变量占用内存的地址200010i_pointer*i_pointerii_pointer&i&(*i_pointer)i*i_pointer*(&i)i_pointer

=

&i

=

&(*i_pointer)i

=*i_pointer=

*(&i)inti=10,j;int*i_pointer;i_pointer=&i;*i_pointer=20;j=*i_pointer;200020i_pointer*i_pointeri5.1指针和指针变量指针变量…...…...2000200820122010整型变量i10变量i_pointer2002200420062000直接访问与间接访问直接访问:用变量名存取变量值间接访问:通过存放变量地址的变量去访问变量例

i=3;-----直接访问3例*i_pointer=20;-----间接访问205.1指针和指针变量指针变量指针变量的定义一般形式:

数据类型

*指针名;合法标识符指针的目标变量的数据类型表示定义指针变量不是‘*’运算符例int

*p1,*p2;float*q;char*name;注意:1、int*p1,*p2;与int*p1,p2;2、指针变量名是p1,p2,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,应用前必须先赋值5.1指针和指针变量指针变量的初始化一般形式:数据类型

*指针名=初始地址值;例inti;int*p=&i;变量必须与已说明过的类型应一致例

int*p=&i;

inti;例inti;int*p=&i;int*q=p;用已初始化指针变量作初值5.1指针和指针变量例int

main(){inti=10;int*p;*p=i;printf("%d",*p);return0;}危险!例

int

main(){inti=10,k;int*p;p=&k;*p=i;printf("%d",*p);return0;}指针变量必须先赋值,再使用…...…...2000200820122010整型变量i10指针变量p200220042006随机5.1指针和指针变量inta=20,b=15,c;int*p1=&a,*p2=&b;int*p3;p3=p2,p2=p1,p1=p3;c=*p2,*p2=*p1,*p1=c;2015ab2015abp1p22015abp2p11520abp2p15.1指针和指针变量指向数组元素的指针变量例intarray[10];int*p;p=&array[0];//

p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指针p&array[0]p数组名是表示数组首地址的地址常量5.2指针与一维数组指针的运算指针变量的赋值运算p=&a;(将变量a地址p)p=array;(将数组array首地址p)p=&array[i];(将数组元素地址p)p1=p2;(指针变量p2值p1)不能把一个整数p,也不能把p的值整型变量如

inti,*p;p=1000;(

)i=p;(

)5.2指针与一维数组指针的算术运算:pipid(i为整型数,d为p指向的对象所占字节数)p++,p--,p+=i,p-=i等若p1与p2指向同一数组,p1-p2=两指针间元素个数

(p1-p2)/dp1+p2无意义例p指向int数组,则p+1p+14例p指向int型数组,且p=&a[0];

则p+1指向a[1]例inta[10];int*p=&a[2];p++;*p=1;例inta[10];int*p1=&a[2];int*p2=&a[5];

则:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a数组pp+1,a+1p+i,a+ip+9,a+915.2指针与一维数组指针变量的关系运算若p1和p2指向同一数组,则p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1与p2指向同一元素若p1与p2不指向同一数组,比较无意义5.2指针与一维数组数组元素表示方法[]下标运算符a[i]

*(a+i)a[i]

p[i]

*(p+i)

*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]aa+9a+1a+2地址元素下标法a[0]a[1]a[2]a[9]......a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)......5.2指针与一维数组a[0]a[1]a[2]a[3]a[4]例数组元素的引用方法#include<stdio.h>intmain(){inta[5],*pa,i;for(i=0;i<5;i++) a[i]=i+1;

pa=a;for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i));for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]);for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);return0;}12345pa5.2指针与一维数组例:通过指针求数组中所有元素的平均值。#include<stdio.h>intmain(){inta[10],i;floatsum=0;printf("Enter10integers:\n");for(i=0;i<10;i++){scanf("%d",a+i);//a+i和&a[i]是等价的

sum+=*(a+i);//*(a+i)和a[i]是等价的

}printf("Theaverageofthe10integersis:%f\n",sum/10);return0;}5.2指针与一维数组例:用指针求数组中的最大值及其位置。#include<stdio.h>intmain(){inta[10],*p,*pMax;printf("Enter10integers:\n");

for(p=a;p<a+10;p++)scanf("%d",p);pMax=a;/*设下标为0的元素为最大值*/p=a+1;for(;p<a+10;p++){if(*p>*pMax)pMax=p;/*pMax保存最大元素的地址*/}printf("Themaxis%d\n",*pMax);printf("ThepositionofMaxis%d\n",pMax-a);return0;}5.2指针与一维数组intmain(){inti,*p,a[7];p=a;for(i=0;i<7;i++)scanf("%d",p++);printf("\n");for(i=0;i<7;i++,p++)printf("%d",*p);return0;}例注意指针的当前值p=a;pp58762730123456apppppp指针变量可以指到数组后的内存单元5.2指针与一维数组intmain(){intt,*p,*q,a[7];for(p=a;p<a+7;p++)scanf("%d",p);

for(;p<q;p++,q--){t=*p;*p=*q;*q=t;}……return0;}例逆置一维数组中的数据。p=a;q=a+6;pp58762730123456appqqq指针与一维数组q例对一维数组中的数据按由小到大的顺序排序指针与一维数组qp58762730123456aqqqqqintmain(){intt,*p,*q,a[7];for(p=a;p<a+7;p++)scanf("%d",p);for(p=a;p<a+6;p++)for(q=p+1;q<a+7;q++)if(*p>*q){t=*p;*p=*q;*q=t;}……return0;}练习:1.查找:从键盘输入一个数x,输出x是否在该数组中,如在,输出在数组中的位置,如不在,输出“不存在”的信息。2.在上题的基础上删除查找到的数字。二维数组的地址对于一维数组:(1)数组名array表示数组的首地址,即array[0]的地址;(2)数组名array是地址常量(3)array+i是元素array[i]的地址(4)array[i]

*(array+i)arrayintarray[10];5.3指针与二维数组对于二维数组:(1)a是数组名,包含三个元素

a[0],a[1],a[2](2)每个元素a[i]

又是一个一维数组,包含4个元素aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020162032200020042016202020322036a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]行指针与列指针a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+15.3指针与二维数组对二维数组inta[3][4],有a-----二维数组的首地址,即第0行的首地址a+i-----第i行的首地址a[i]*(a+i)------第i行第0列的元素地址a[i]+j*(a+i)+j-----第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含义不同a+i

&a[i],表示第i行首地址,指向行a[i]

*(a+i)

&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020162032200020042016202020322036a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+25.3指针与二维数组表示形式含义地址a二维数组名,数组首地址a[0],*(a+0),*a第0行第0列元素地址a+1第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素地址*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素值20002000201620162024135.3指针与二维数组用指针访问二维数组指向二维数组数组元素的指针变量例指向二维数组数组元素的指针变量intmain(){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);}return0;}p=*a;p=&a[0][0];p=*(a+0);inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]p5.3指针与二维数组例:定义一个三行四列的整型二维数组,输入数据,求最小元素及位置。#include<stdio.h>intmain(){inta[3][4],*p; //定义整型指针pinti,j,*pmin; //pmin用来指向找到的最小元素p=&a[0][0]; //p指向了二维数组第一个元素

printf("Enterthearray:\n");for(i=0;i<3;i++)for(j=0;j<4;j++)scanf("%d",p+4*i+j); //输入第i行第j列的元素5.3指针与二维数组

pmin=&a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(*(p+4*i+j)<*pmin)pmin=p+4*i+j; printf("Theminvalis%d.\n",*pmin); //输出最小元素

printf("Theminvalisatrow%dcol%d.\n",(pmin-&a[0][0])/4,(pmin-&a[0][0])%4);return0;}5.3指针与二维数组行指针变量定义形式:数据类型(*指针名)[一维数组元素个数];

例int(*p)[4];()不能少int(*p)[4]与int*p[4]不同p是行指针可让p指向二维数组某一行如

inta[3][4],(*p)[4]=a;inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2pp+1p+2p[0]+1或*p+1p[1]+2或*(p+1)+2*(*p+1)或(*p)[1]

*(*(p+1)+2)行指针变量“一维数组元素个数”和二维数组列数必须相同例行指针变量举例main(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

inti,j,(*p)[4];for(p=a,i=0;i<3;i++,p++){for(j=0;j<4;j++)printf("%d",*(*p+j));printf("\n");}}inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]ppp

p[0][j]intmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

inti,j,(*p)[4];for(p=a,i=0;i<3;i++){for(j=0;j<4;j++)printf("%d",*(*(p+i)+j));printf("\n");}return0;}5.3指针与二维数组例:输入一个四行四列的矩阵,判断其是否为对称矩阵。#include<stdio.h>intmain(){inta[4][4];

int(*p)[4];inti,j,flag=1;

p=a; //为行指针p赋初值printf("Enterarrayelements:\n");for(i=0;i<4;i++) //输入数组元素的值for(j=0;j<4;j++)scanf("%d",*(p+i)+j);5.3指针与二维数组for(i=0;i<4;i++)for(j=0;j<i;j++)if(p[i][j]!=p[j][i]) {flag=0;break;}if(flag)printf("Yes!"); //是对称矩阵,打印Yeselseprintf("No!"); //不是对称矩阵,打印Noreturn0;}5.3指针与二维数组例二维数组与指针运算intmain(){inta[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}};inti;int(*p)[4]=a,*q=a[0];for(i=0;i<3;i++){if(i==0) (*p)[i+i/2]=*q+1;else p++,++q;}for(i=0;i<3;i++)printf("%d,",a[i][i]);printf("%d,%d\n",*(*p),*q);return0;}运行结果:2,4,7,5,3123434565678pq2pqpq字符串表示形式用字符数组实现例int

main(){charstring[]="IloveChina!";printf("%s\n",string);printf("%s\n",string+7);return0;}IloveChistring[0]string[1]string[2]string[3]string[4]string[5]string[6]string[7]string[8]string[9]stringstring[10]string[11]string[12]string[13]n!a\05.4指针与字符串用字符指针实现例intmain(){char*string="IloveChina!";printf("%s\n",string);string+=7;while(*string){putchar(*string);string++;}return0;}IloveChistringn!a\0字符指针初始化:把字符串首地址赋给stringchar*string;string="IloveChina!";string*string!='\0'5.4指针与字符串字符指针变量与字符数组char*cp;与

charstr[20];str由若干元素组成,每个元素放一个字符;

而cp中存放字符串首地址

charstr[20];str="IloveChina!";(

)char*cp;cp="IloveChina!";(

)str是地址常量;cp是地址变量cp接受键入字符串时,必须先开辟存储空间例charstr[10];scanf("%s",str);(

)而char*cp;scanf("%s",cp);(

)改为:char*cp,str[10];cp=str;scanf("%s",cp);(

)5.4指针与字符串字符指针变量与字符数组字符数组的各元素是可以修改的,但是字符指针指向的字符串常量是不能修改的。例如:charstr[]="House";char*p="House";str[2]='r'; //正确,字符数组的值可以修改。p[2]='r'; //错误,不能修改字符串常量。所以,指向字符串的指针既不能用于输入,也不能对其间接运算表达式赋值。5.4指针与字符串#include<stdio.h>intmain(){charstr[100];char*p;intcnt1,cnt2,cnt3;puts("Enterastring:");gets(str);

cnt1=cnt2=cnt3=0;

p=str;while(*p!='\0'){

p++;}//用指针p访问字符串中的每个字符printf("digit:%d\n",cnt1);printf("letter:%d\n",cnt2);printf("other:%d\n",cnt3);return0;}【例】从键盘输入一串字符,统计其中数字字符、字母和其他字符的个数。5.4指针与字符串if(*p>='0'&&*p<='9')cnt1++;elseif((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z'))cnt2++;elsecnt3++;练习:1.将给定的字符串复制到另一字符串。2.从键盘输入一行字符串,把该字符串中的所有小写字母变成大写字母,输出该字符串。3.从键盘输入一个字符串,输出该字符串的长度,不使用strlen()函数。用于处理二维数组或多个字符串指针数组定义形式:数据类型

*数组名[数组长度说明];例int*p[4];指针所指向变量的数据类型区分int*p[4]与int(*p)[4]5.5指针数组指针数组的应用1.用指针数组访问二维数组

inta[3][4],*p[3]={a[0],a[1],a[2]};↓p[i]+0↓p[i]+1↓p[i]+2↓p[i]+3p[0]→a[0][0]a[0][1]a[0][2]a[0][3]p[1]→a[1][0]a[1][1]a[1][2]a[1[3]p[2]→a[2][0]a[2][1]a[2][2]a[2][3]5.5指针数组例:利用指针数组输出二维数组中的元素.#include<stdio.h>intmain(){inti,j;inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int*p[3]; //定义指针数组

p[0]=a[0];p[1]=a[1];p[2]=a[2]; //指针数组赋初值for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%5d",*(p[i]+j));

printf("\n");}return0;}5.5指针数组2.指针数组指向多个字符串常量初始化:intmain(){char*p[]={"Fortran","Lisp","Basic"};……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]5.5指针数组

charname[5][9]={"gain","much","stronger","point","bye"};

char*name[5]={"gain","much","stronger","point","bye"};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二维数组与指针数组区别:例:输入0到6的数字,分别代表周日到周六,输出对应的英文名称。#include<stdio.h>intmain(void){char*strDay[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};intday;scanf("%d",&day); //读入整数if(day>=0&&day<=6)puts(strDay[day]); elseputs("InputError!");return0;}5.5指针数组#include<stdio.h>intmain(){char*str[11]={"Icon","saw","memory","array","across","furcate","hypercube","independent","incurvate","indeterminate","indifferent"};chars[12];inti;for(i=0;i<11;i++)s[i]=str[i][i];s[i]='\0';printf("%s\n",s);return0;}【例】指定N个字符串,顺序从各个字符串中取出第1、第2、……、第N个字符,形成一个新的字符串。5.5指针数组

解题思路:定义一个能存放5个字符串的二维字符型数组cty[5][80],再定义一个指向cty的字符型指针数组str[5],使其每个元素指向一个字符串,并从键盘输入这些字符串存入字符型数组。在选择排序中,通过指针将每个字符串作为一个整体进行比较,在需要交换时,只交换指针数组元素的指向,并不交换数组中的字符。排序完成后,按指针数组元素的顺序输出各个字符串。【例】用选择法对给定的5个字符串按从小到大的顺序排序。3.用指针数组实现字符串排序5.5指针数组#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);

for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;

}printf("升序排序结果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrstrstrstrstrstr#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);

for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;

}printf("升序排序结果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkjkjjji=0

#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);

for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;

}printf("升序排序结果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkjkjji=1

#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);

for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;

}printf("升序排序结果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkjkji=2#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);

for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;

}printf("升序排序结果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkji=3#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);

for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;

}printf("升序排序结果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstri=3

#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);

for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;

}printf("升序排序结果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrstrstrstrstrstr字符串按字典顺序排序—二维数组编程char

str[N][10]={"Pascal","Basic","Fortran","Java","VisualC"},temp[10];

for(i=0;i<N-1;i++) {k=i; for(j=i+1;j<N;j++)

if(strcmp(str[j],str[k])<0) k=j;if(k!=i) {strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp); }}strstrstrstrstrstrstrstrstrstr函数指针:函数在编译时被分配的入口地址,用函数名表示max…...指令1指令2函数指针变量赋值:如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数指向函数的指针变量定义形式:数据类型(*指针变量名)();如int(*p)();函数指针变量指向的函数必须有函数说明函数调用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);对函数指针变量pn,p++,p--无意义()不能省int(*p)()与int*p()不同5.6函数指针例用函数指针变量调用函数,比较两个数大小intmain(){intmax(int,int);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c);return0;}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){intmax(int,int),(*p)();inta,b,c;

p=max;scanf("%d,%d",&a,&b);c=(*p)(a,b);//或者c=p(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c);return0;}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}5.7多级指针(指向指针的指针)定义:指向指针的指针一级指针:指针变量中存放目标变量的地址p2&p1&i3p1(指针变量)i(整型变量)例int**p2;

int*p1;inti=3;p1=&i;p2=&p1;**p2=5;二级指针:指针变量中存放一级指针变量的地址例int*p;

inti=3;p=&i;*p=5;&i3p(指针变量)i(整型变量)一级指针单级间接寻址二级指针一级指针目标变量二级间接寻址定义形式:[存储类型]

数据类型**指针名;如char**p;例inti,**p;p=&i;(

)//p是二级指针,不能用变量地址为其赋值指针本身的存储类型最终目标变量的数据类型*p是p间接指向对象的地址**p是p间接指向对象的值例inti=3;

int*p1;

int**p2;p1=&i;p2=&p1;**p2=5;ip1p23&i&p1**p2,*p1*p2多级指针例三级指针int***p;

四级指针char****p;5.7多级指针(指向指针的指针)例用二级指针处理字符串#defineNULL0intmain(){

char**p;char*name[]={"hello","good","world","bye",""};

p=name+1;printf("%o:%s",*p,*p);p+=2;while(**p!=NULL)printf("%s\n",*p++);return0;}name[0]name[1]name[2]name[3]name[4]char*name[5]worldbye\0hellogoodnamep运行结果:644:goodbye用*p可输出地址(%o或%x),也可用它输出字符串(%s)p

*(p++)5.7多级指针(指向指针的指针)二级指针与指针数组的关系

int**p与int*q[10]指针数组名是二级指针常量p=q;p+i是q[i]的地址指针数组作形参,int*q[]与int**q完全等价;但作为数组和变量定义两者不同系统只给p分配能保存一个指针值的内存区;而给q分配10块内存区,每块可保存一个指针值5.7多级指针(指向指针的指针)零指针与空类型指针零指针:(空指针)定义:指针变量值为零表示:int*p=0;

p指向地址为0的单元,系统保证该单元不作它用表示指针变量值没有意义#defineNULL0int*p=NULL:p=NULL与未对p赋值不同用途:避免指针变量的非法引用在程序中常作为状态比较

例int*p;......while(p!=NULL){...…}void*类型指针表示:void*p;使用时要进行强制类型转换例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一种类型数据的指针变量5.7多级指针(指向指针的指针)例下列定义的含义(1)int*p[3];(2)int(*p)[3];(3)int*p();(4)int(*p)();(5)int*(*p)();(6)int(*p[3])();

温馨提示

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

评论

0/150

提交评论