理工软件工程考研-c语言程序设计c2012-d10new_第1页
理工软件工程考研-c语言程序设计c2012-d10new_第2页
理工软件工程考研-c语言程序设计c2012-d10new_第3页
理工软件工程考研-c语言程序设计c2012-d10new_第4页
理工软件工程考研-c语言程序设计c2012-d10new_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

指针基本概一、变指针基本概一、变量与变量变名称:编程时用(进行编程,程序中按名引用)数据类型:编程、编译和运行时用(决定占用多少单元……)值(内容):运行时使用(进行运算和单元中,每个单元都有唯一的地址。变量在内存中占据的单元的首地址。特点:运行时动态出现,地址不可预测第2指针的概指针:变量的地址一般变量 变量的直 :通过变量 该变指针变量:保存变量地址的变 指针变量说数据类*变量第3已知:charch='A'*若变量ch在内存中对应的地址为变量名称:ch,类型为char,占用1个字ch的值(内容变量ch的地址:1000指针变量pc是char型指针pc=&ch; /*&取地址*/pc的内容则称指针变量pc指向变量

4三、指针运算运算符( 取变量的地 取指针变量所指向的内 注运算&和“位与”运算是同一符号;运算符*和“乘”运算是同一符号。只能从程序的上下文来区分运算&*的实际意义第5实

已知:intx=2,y,*x为一般变量,px为指针型变 px 取变量x的地址赋值给指针又称为:px指向变量x <==>*px10;也称为间第6 y=

<==>y=

取指px所y=x**px=

<==>y=*px*<==>x=y*<==>++*(*px)++;括号不能省若若px已指向x,则可以用*px代替变量第7指针可以指向所有对指针指向数组--数组指针由指针组成的数组--指针数指针指向结构--结构指第8第8指针与函数的关通过参数在函数之间传递变量地址,即在数之间传递指向变量的指针函数的返回值为指针指针指向的对象是函数,称为函数指针第9在函数之间传递变量的地在函数间通过一般的变量可以传递变量的形式参数:int*实际参数注意:实参的数据类型要与作为形参的指针所指的对象的数据类型一致。第10例C9-例C9-1.C:使用函数plus求两个数的和例C9-#include<stdio.h>voidmain(){inta,b,c;printf("EnterAandB");scanf("%d%d",&a,&b);c=plus(&a,&b); /*参为变量地址*/printf("A+B=%d",c);}plusint*pxint*py)/*参为指{return(*px+*py}第11例C9-2.C:用子函数交换主函数中两个变量的例C9-#include例C9-{inta=5,printf("brfortswapa=%db=%d\n"ab);swap&a&b);/*参为变量地址*/printf("afterswapa=%d,b=%d\n",a,b);}{=/*px内容赋给={=/*px内容赋给=/*py所指内容赋给px指变=/*temp赋给py指的变}第12main main函{a={temp=语①b=*px=语②swap(*px,*swap(*px,*py}

*py= }形参变量②*px=

用ap

①temp=5变555

形参变量

③*py

swap

第13指向函数的指定义函数指类型标识*量名给函数指针变量赋函数指针变数名通过指针变量调用函(*数指针变量)(实际参第14例9-4:用指针调用函数实现求两个数中最大值#include<stdio.h>voidmain(){intmaxintint/*数说明*/int*pf/*数指针定义*/inta,b,c;pf=max;/*将函数的地址赋给指针*/scanf("%d,%d",&a,&b);c*pf)(ab);/*指针调*/printf("a=%d,b=%d,max=%d",a,b,c);c=(c=(*pf)等价于cmax(aintmax(intx,inty{return(x>y)?x:}第15在函数的形参中使用指向函数的指形参是函数指针时,实参应为函数名,即函在内存中的可执行代码的首地址( )。voidqsort(void*base,size_tnelem,size_tint(*fcmp)(constvoid*,constvoid*));Sortsnelementriesofsizewidthlocatedatbase.Rankingisdeterminedbyuser-definedroutinefcmp,returning<0ifelem1<elem2;=0ifelem1==elem2;>0ifelem1>第16指针的基本运指针的三种基本指针与正整数的加减运两个指针的关系运两个指针的减法运第17指针与正整数的加减当指针p指向数组中的某个元素时,n为正整数:p+n:指针p所指向当前元 后的第n个元素p-n:指针p所指向当前元 前的第n个元素p++和++p:指针加1,指向当前元素的下一个元素p--和--p:指针减1,指向当前元素的前一个元素高地

0

第18例C9-5.Cvoidmain({chara[50],b[30];printf("a+b=%s\n",strcat(a,b)}例C9-例C9-第19例C9-5.Cchar*strcat(str1,str2)char*str1,*str2;{char*p=str1;while(*p!=’\0’)

回指串结while((*p=*str2)!=’\0’{str2}return}

连回指例C9-第20例C9-指针的基本运算while((*p=*str2)!=’\0’指针的基本运算{str2}改进while((*p++=*str2++)!=’\0’;改进while(*p++=*str2++;第21两个指针之间的关系运当两个指针指向同一个数组中的元素时,才能>、<、>=、<=、!=、==关系运算。当指针p、q指向同一数组中的元素时,则p<qp所指的元素在q所指的元素p==q:若指针p、q指向同一个元素,p!=q:若指p、q指向不同的元素,则第22基本运算辨intx=10,y=5,*p=&x, pq;指针赋值。使指针pq指向p *p*q;所指内容赋值*p*q的值 第23基本运算辨已知:intx=10y=5*p=&xp== 指针p、q是否指向同一单 指针p、q所指内容是否相NULL:指针常量。具有特殊含义,表示任意指pNULL进行“P==NULL”或“P!=NULL”运算均有意义:判断指针p是否为空。第24例C9-revstrchar*s s反{char*p=s,c;while(*p) 到串结束标 向串的最1个字符while(s<p)c 换两个指针所指字*s+ 赋值再移*p--=}}第25两个指针之间的当两个指针指向同一数组中的元素时,才能进行指针间的减法运算;当两个指针分当两个指针指向同一数组中的元素时,p-的物理意义是:指针p和q之间包含的元素第26指针的基本运算例C9-7.C:编写函数,求字符串的长指针的基本运算strlenchar*s /*串s的长{char*p=whilewhile(*p++;return(p-s-1/*个指针相减法,求出串例C9-例C9-abcdef 串长

第27例C9-8.C:编写递归函数,求字符串的长度。当前字符'\0',的串长串分为两部分:第一个字其abcdefgh1余部分的长程strlen(char*s{if(*s=='\0')return(0); return(1+strlen(s+1));例C9-例C9-第28例C9-9.C:用递归的方法完成串反向算法分析将给定的字符串分为两个部第1部分:首字尾字第2部分:第二个字倒数第二第2部分与原问题性质一致,只是规模缩小基本算将第二部分构成一个字符串,递归:完成第二部分串反向;交换第一部分的两个字符第29基本算将第二部分构成一个字符串,递归:完成第二部分串反向;交换第一部分的两个字符算法实用两个指针分别指向串的首字符和尾字将中间部分构成“新的”字符串,并对其行串反向操作交换串的首尾两个字符第30abcdefrevstr(charabcdef{char*p=s, while(*p)p-- //①if(s<pc=c==②=③

fbcdefs满足sfbcdefa fbfbcde 递归 *p= // 例C9-

ffba

第31数组与指数组与指针的关数组中的每个元素都可以通过下标唯一确定,即通过下标可以(操作)数组中的在C语言中,凡是可以通过下标方式完成的(操作)均可以通过指针实现。称为第32概念复假设 int数组名:标识数组数组元素的地址:数组中下标为k的元素的地址(&a[k])数组首地址(起始地址):数组中第1个元素下标为0的地址(&a[0或用数组a表C语言规定:数组名是数组的首地址常量。关系表达式:a==]成立。第33例C9-例C9-10.C:分析程序例C9-#includemain({inta[]={1,2,3,4,5}intx,y /*针变pp=x=y=

/*pa[0],等价于p=a/*指针p+2的内容,等价于x=a[2/*指针p+4的内容,等价于y=a[4printf("*p=%d,x=%d,y=%d\n",*p,x,}指针方 数组

下标方

数组

指针方第34例C9-11.C:分析程序main(

例C9-{inta[]={1,2,3,4,5,6};intprintf("%d", printf("%d\n",printf("%d",*++p);printf("%d\n",*(p--));p+=3;printf("%d%d\n",*p,*(a+3)}指针初始

地址数1212345第1个输第4个输第5个输

取p所指内取所指内p1p所指的内

第35在函数之间传递整个数实参用数组名形参用数组名或指针当形参是数组时,在被调用函数中可采用下当形参是指针时,在被调用函数中可采用指针方式数组中的元素。特别说由于数组名代表数组的首地址,传递数组名36例C9-12.C例C9-12.C:编写字符例C9-{chara[30],scanf("%s",strcopyab 参为数组printf("a=%s\nb=%s\n",a,b}strcopy(str1,str2char*str1*str2;参为指{while((*str2=*str1)!=’\0’str1 过指针操}}共114 第37 strcopy(char*str1,char*str2{while(*str2=*str1 }

例C9-}例C9-改进二例C9-strcopy(char*str1,char*str2{while(*str2++=*str1++;}第38指针数

数组与指针数组中的元素均为指针类型,称为指针数组说明的形式数据类型*数组名[常量表达式]例如:int*pa[6];指针数组pa是包含6个元素的数组,指针数组

39字符数组与字符串例C7_3002.C输入英文星期几,确定对应的数字。900SundayMondaycharweek_day[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};6Saturday1用二维字符数 星期表,每行存一个字符第40例例C7_3002.C:程例charweek_day[][10]={"Sunday","Wednesday","Thursday","Friday","Saturday"main({inti,j;charid[10];printf("Entera scanf("%s",for(i=0i<7 /*找每一{for(j=0;c=week_day[i][j]==id[j]&&id[j]!=’\0’;j++)/*输入的字符id与每一行中的串进行比if(c=week_day[i][j]==id[j] /*找到对应字符串则}if(i<7)printf("%sis%d\n",id, printf("Error}

第41例#include<stdio.h>#include<string.h例charweek_day[][10]={"Sunday","Wednesday","Thursday","Friday","Saturday"intmain( inti,j;charprintf("Enterastring:");scanf("%s",id);for(i=0;i<7;i++)if(strcmp(week_day[i],id)==0 printf("%sis%d\n",id,i);}if(i>=7printf("Error!\n");return0;}

42指针数组例C9-14.C:将week_day组实指针数组数组sundaymosundaymondaytuesdaywednesdaythursdayfridaysaturday char*week_day[]={"sunday","monday","tuesday",第43例#include<stdio.h>#include<string.h例char*week_day[]={"sunday",...,NULL};intmain() inti,j;charprintf("Enterastring:");scanf("%s",id);for(i=0;week_day[i]!=NULL;i++)if(strcmp(week_day[i],id)==0 printf("%sis%d\n",id,i);return0;}printf("Error!\n");return-1;}

第44例C9-14.Cchar*week_day[8]={"sunday","monday","tuesday","wednesday","thursday","friday","saturday",NULL};例C9-main(例C9-{int charprintf("Enterastring:");scanf("%s",string);l=lookup(string); printf("l=%d\n",l);}lookupcharch[] /*传递字符串(字符数组){inti, charfor(i=0week_day[i]!=NULLi+)/*完成查找工;if(*pc==ch[j&&*pc=='\0’)return(i/*找到}return(- /*若没有找到,则返回-1}第45指针数组例C9-例C9-14:用指针数组实现输入字符串查找是指针数组例C9-char*week_day[8]={"sunday","monday","friday","saturday",NULL};main({intl; charstring[20];scanf("%s",string);l=lookup(string);printf("l=%d\n",l}46指针数组lookupcharch[])递字符数指针数组例C9-{inti, char例C9-for(i=0;week_day[i]!=NULL;i++{pc=week_day[i];while(*pc==ch[j]&&*pc!==='\0’{j++;}if(*pc==ch[j]&&*pc=='\0’}return(- 没有找到,则返回-}47例C9-15.C:输入星期几(数字),输出对应星char*week_day[8]={"sunday","monday","friday","saturday",NULL};main({intday;char*p,*lookstr();scanf("%d",&day);例C9-p=lookstr(week_day,例C9-}第48char*lookstrtableday回指针char*table;递指针数组intday;{intwhile(i<day&&table[i]!=NULL)if(i==day&&table[i]!=NULLreturn(table[day]);return(NULL例C9-例C9-第49char*week_day[8]={"sunday","monday","tuesday",main()例C9-{int char*lookstr(printf("Enterday:scanf("%d",例C9-{int char*lookstr(printf("Enterday:scanf("%d",p=lookstrprintf("%s\n",}charlookstrtableday)/*回指向字符*table /*数{(i=0;i<day&&table[i]!=NULL;)}第50数组指

数组与指针指向数组的指针称为数组指针说明形式数据类*针变量名)[常量表达式];例如:int(*pb)[6];数组指pb指向一个数组,该数组是一维的有6个元素的整型数组。整整整整整整整整第51数组与函数例:给定日期,计算该天是一年中的第数组与函数例C8-main(例C8-{staticintday_tab[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,{0,31,29,31,30,intscanf("%d%d%d",&y,&m,printf("%d\n",day_of_year(day_tab,} 910110001共114 第52day_of_year(d_tab,year,month,day例C8-intd_tab 维数例C8-intyear,month,{inti=(year%4==0&&year%100!=0i:0为平年,1为闰年for(j=1;j<month;j++)day+=d_tab[i][j];return(day);} 910110001共114 第53例C9-13.Cday_of_year(day_tab,year,month,*{i,i=for(j=1;j<month;)day+=*(d_tab+i*13+j);}00

例C9- 第54day_of_year(day_tab,year,month,day)int(*d_tab)[13],year,month,day;{inti,i=for(j=1;j<month;j++)day+=(*(d_tab+i))[j];return}

91011例C9-16.C例C9-16.C:用数组指针作形例

0

第55day_of_year几种形参的数据类型比◆面一系列与day_of_year相关的实例中,主函数使用staticintday_tab[2][13]={0,31,29,31,30,31,30,31,31,30,31,30,31被调用函数的头部说明如下day_of_year(day_tab,year,month,day在C8-6.C中子函数中第一个参数说明为intday_tab[形参day_tab为一个二维数组形 9

温馨提示

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

评论

0/150

提交评论