第七章数组和指针ؤ内容摘要:
amp。 的优先级与 !, ++, 等相同 , 是 自右到左结合 的。 指针变量可以出现在表达式中。 y=*px+3与 y=x+3功能相同 d=sqrt((double)*px)是把 px的平方根保存在 d中。 下面这些表达式都是合法的: *px+=6 与 x+=6 功能相同 (*px)++与 x++相同 *px++ 与 (*px)++不同 , 而是等价于 *(px++) amp。 *px 与 amp。 x 功能相同 *amp。 x与 x等价 说明 : 1. px++ 等于 px=px+1*px的类型长度 例如 : int x[2]={10,20},*px=x。 设 x=ffe4 则 px=ffe4=amp。 a[0]=a 这时 经 px++后 , px的值是 ffe6=amp。 a[1] *px=a[1]=20 2. 指针变量之间可以互相赋值 , 例如 : int x[10],*px=amp。 x,*py。 char ch[2],*pc=ch。 py=px ,py=px+9 (合法 ) py=pc (不太合法 ) py=(int *)pc (合法 ) 167。 指针作为函数参数 swap(x,y) main() int x,y。 { int a,b。 { int temp。 a=10。 temp=x。 b=20。 x=y。 swap(a,b)。 y=temp。 printf(“%d,%d”,a,b)。 } } 在C语言中 , 函数的参数可以是指针类型。 例 :写一函数 swap, 交换两个整型变量的值 . main() swap(px,py) { int a,b。 int *px,*py。 a=10。 { int temp。 b=20。 temp=*px。 swap(amp。 a,amp。 b)。 *px=*py。 printf(“%d,%d”,a,b)。 *py=temp。 } } 10 20 amp。 a=ff00 amp。 b=ff02 px py ff00 ff02 2010[例 ] 编写一个程序从键盘上读入一行 , 并统计在该行里的白空字符和小写字母的个数。 include int get(ws,lc) int *ws,*lc。 {int c。 *ws=*lc=0。 while((c=getchar())!=EOF) switch(c) { case „‟: case „\t‟: (*ws)++。 break。 case „\n‟: return 1。 default: if(c=„a‟amp。 amp。 c=„z‟) (*lc)++。 } return 0。 } main() {int ws,lc。 if(get(amp。 ws,amp。 lc)) {printf(“There are %d whitespace characters”,ws)。 printf(“\nand %d lowercase letters\n”,lc)。 } else printf(“unexpected endoffile\n”)。 } 切记 :指针变量在引用之前一定要先赋值 , 否则其所指的地址不定 , 所引用的是垃圾数据。 而对未赋值指针变量所指地址中赋值更会产生灾难性的后果。 如果在主函数中将 ws和 lc定义为 int *ws,*lc,应该如何调用 get函数 ? 指针和数组 C语言中 , 数组名就是一个指向此数组第 0个元素的指针 , 采用指针访问数组一般会更快些。 例如: int a[10],*pa。 pa=amp。 a[0]。 /*或 pa=a*/ 则有 : a[0],*(a+0),*a,*pa,*(pa+0),pa[0]等价 a[i],*(a+i),pa[i],*(pa+i)等价 执行赋值语句: pa=amp。 a[2]; 或 pa=a+2 则 *pa是 a[2]的值, *(pa+1)是 a[3]的值。 即任何数组中下标表达式都可以写成指针和位移量构成的表达式形式,反之亦然。 数组名和指针变量是有区别的 : 指针常量 , 而不是指针变量 , pa=a和 pa++等都是有意义的操作; a=pa,a++或 p=amp。 a之类的表达式都是非法的。 ( 指针 ) 变量 例如 :fun(x,y) int x[],y[][4]。 这时 x[]等价于 *x, y[][4]等价于 (*y)[4] 则 x++,y+=1 是有意义的操作 指针和数组 [例 ]用气泡法单向排序。 main() { int i,a[]={3,4,2,5,1}。 sort(a,5)。 for(i=0。 i5。 i++)printf(“%d”,*(a+i))。 } sort(p,n) int *p,n。 /*或 int p[],n */ { int i,t,*pj。 for(i=1。 in。 i++) for(pj=p+n1。 pjp+i1。 pj) if(*(pj1)*pj) {t=*pj。 *pj=*(pj1)。 *(pj1)=t。 } } 3 4 2 5 1 p 当 p和 pj 不重叠时 pj main() {int num,i,a[100]。 scanf(“%d”,amp。 num)。 if(num100) {puts(“too many number!”)。 exit(0)。 } for(i=0。 inum。 i++)scanf(“%d”,amp。 a[i])。 sort(a,num)。 for(i=0。 inum。 i++)printf(“%d”,a[i])。 } [例 ]用气泡法上浮下沉排序。 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] a[11] a[12] a[13] a[14] 11 9 10 1 0 5 4 6 8 7 2 3 1 2 3 上浮有序 未排序 下沉有序 0 n1 l r j sort(a,n) int a[],n。 {int l,r,k,j,t。 for(l=1,r=n1,k=n。 l=r。 r=k1) {for(j=r。 j=1。 j) if(a[j1]a[j] {t=a[j1]。 a[j1]=a[j]。 a[j]=t。 k=j。 } for(j=l=k+1。 j=r。 j++) if(a[j1]a[j]) {t=a[j1]。 a[j1]=a[j]。 a[j]=t。 k=j。 } } } 寻找第 l小的数 寻找第 r大的数 指针和数组 y[0] y[1] y[2] y[3] y y+1 y[0]+1 y/ y[0],*(y+0),y / y+1/ y[1],*(y+1)/ y[1]+2,*(y+1)+2,amp。 y[1][2]/ *(y[1]+2),*(*(y+1)+2,y[1][2] 0f00h 0f04h 0f08h 0f0ch 0f10h 0f14h 0f18h 0f1ch 0f20h 0f24h 0f28h 0f2ch 指针与多维数组。 例 : float y[4][3],(*py)[3],*p。 则有 : amp。 y[i][j]=y[i]+j=*(y+i)+j *amp。 y[i][j]=*(y[i]+j)=*(*(y+i)+j)=y[i][j] 由 y[i]=*(y+i) 则有 amp。 y[i]=amp。 *(y+i)=y+i 说明: amp。 y[i]和 y[i]的值相同 , 但意义不同 amp。 y[i]指向行 *(amp。 y[i]+j)=*(y+i+j)=y[i+j] y[i]指向列 *(y[i]+j)=*(*(y+i)+j)=y[i][j] 指针和数组 float y[4][3],(*py)[3],*p。 py=y。 则有 : py[i][j]=*(py[i]+j)=*(*(py+i)+j) 若有: p=y 则有 *p=*(p+0)=y[0][0] *(p+6)=y[2][0] *(p+1)=y[0][1] *(p+7)=y[2][1] *(p+2)=y[0][2] *(p+8)=y[2][2] *(p+3)=y[1][0] *(p+9)=y[3][0] *(p+4)=y[1][1] *(p+10)=y[3][1] *(p+5)=y[1][2] *(p+11)=y[3][2] 指针和数组 [例 ]把某月的第几天转换为这年的第几天。 反过来 , 将某年的第几天转换为日期。 static int day_tab[][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}。 day_of_year(year,month,day) int year,month,day。 { int i,leap。 leap=(year%4==0amp。 amp。 year%100||year%400==0)。 for(i=1。 imonth。 i++) day+=day_tab[leap][i]。 return(day)。 } day_tab[0] day_tab[1]month_day(year,yearday,pmonth,pday) int year,yearday,*pmonth,*pday。 {int i,leap,q。 leap=(year%4==0amp。 amp。 year%100||year%400==0)。 for(i=1。 yearday(q=*(*(day_tab+leap)+i))。 i++) yearday=q。 *pmonth=i。 *pday=yearday。 } 二级指针 一级指针 指针和数组 采用参数传递方式传递数组 day_tab main() { static int day_tab[][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}。 printf(“%d\n”,day_of_year(day_tab,1999,9,9))。 } day_of_year(day_tab,year,month,day) int year,month,day,(*day_tab)[13]。 { int i,le。第七章数组和指针ؤ
本资源仅提供20页预览,下载后可查看全文
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。
相关推荐
第七章民事诉讼代理人
法定诉讼代理人既可以代理当事人处分诉讼权利,也可以代理当事人处分实体权利。 (二)法定诉讼代理人的诉讼地位 法定诉讼代理人在诉讼中处于与当事人类似的诉讼地位 三、法定诉讼代理权的取得和消灭 (一)法定诉讼代理权取得的方式 (二)法定诉讼代理权消灭的原因 第一,被代理人具有或者恢复了民事行为能力。 第二,法定诉讼代理人丧失或者被依法撤销了监护人的资格。 第三
第七章旅游规划理论与方法
有充裕的时间进行研究 与其他政策有很多相关性 政策大范围变动能被政治层面所接受 宜选用渐进模型: 没有适当的理论可用 对老问题进行改进 资源有限 研究时间有限 与其他政策很少相关 政策选择受到政治现实的极大局限 折衷混合模型 —— 混合扫描法( mixed scanning) 步骤: 进行一次一般扫描,以获得全景的概况,从中确定哪些要素质的更为详细察看。