配色: 字号:
第6章 指针
2013-01-25 | 阅:  转:  |  分享 
  
6.2阅读程序,指出程序的运行结果。

(1)

#include

main()

{

intn=10,p=&n;

p=5;

printf("%d\n",n);

}

(2)

#include

main()

{

inta=2,b=4,c=6;

intpa=&a,pb=&b,p;

(p=&c)=pa(pb);

printf("%d\n",c);

}

6.3从键盘输入3个整数,要求设3个指针变量p1、p2、p3,使p1指向3个数中最大者,p2指向次大者,p3指向最小者,然后按由大到小的顺序输出这3个数。



#include



intmain(void)

{

intp1,p2,p3;

inti,j,k,temp;



printf("inputdata,usespacebetweendata\n");

scanf("%d%d%d",&i,&j,&k);



p1=&i;p2=&j;p3=&k;



if(p1
{temp=p1;p1=p2;p2=temp;}

if(p1
{temp=p1;p1=p3;p3=temp;}

if(p2
{temp=p2;p2=p3;p3=temp;}



printf("%d%d%d",p1,p2,p3);



return0;

}

6.4想使指针变量pt1指向a和b中的较大者,pt2指向a和b中的较小者,请问以下程序能否达到此目的?

#includeintswap(intp1,intp2)

{

intp;

p=p1;p1=p2;p2=p;

}



intmain(void)

{

inta,b;

intpt1,pt2;

scanf("%d,%d",&a,&b);

pt1=&a;pt2=&b;

if(a
printf("%d,%d\n",pt1,pt2);

return0;

}

#include

intswap(intp1,intp2)

{

inttemp;

temp=p1;p1=p2;p2=temp;

}

intmain(void)

{

inta,b;

intpt1,pt2;



scanf("%d%d",&a,&b);

pt1=&a;pt2=&b;

if(a
printf("%d%d",pt1,pt2);



return0;

}

6.5阅读程序,指出程序的执行结果。

(1)

#includeintmain()

{

inta[10]=={0,1,2,3,4,5,6,7,8,9},p=a;

printf("%d,%d\n",p+2,(p+2));

return0;

}

(2)

#include

intmain()

{

inti;

inta[10],p=a;

for(i=0;i<10;i++)p++=2i;

for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");

return0;

}

(3)

#include

intmain()

{

inta[5]=={0,1,2,3,4},p;

p=&a[3];

printf("%d\n",--p);

return0;

}

(4)

#include

intmain()

{

inta[5]={1,3,5,7,9},p,k;

p=a;k=&p;

printf("%d,",(p++));

printf("%d,",k);

return0;

}

(5)

#include

intmain()

{

staticinta[]={1,3,5};

ints,i,p=NULL;

s=1;

p=a;

for(i=0;i<3;i++)s=(p+i);

printf("%d\n",s);

return0;

}

(6)

#include

intmain()

{

staticinta[]={1,2,3,4,5};

intp=NULL;

p=a;

printf("%d,",p);

printf("%d,",(++p));

printf("%d,",++p);

printf("%d,",(p--));

printf("%d,",++(p));

return0;

}

(7)

#include

inta[5]={1,2,3,4,5};

intp[5]={a,a+1,a+2,a+3,a+4};

intpp=p;



intmain()

{

pp++;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

pp++;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

++pp;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

++pp;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

pp=p;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

pp++;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

++pp;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

++pp;

printf("%d,%d,%d\n",pp-p,pp-a,pp);

return0;

}

(8)

#include

#include

intmain()

{

chara[]="abcdefgh";

charpc=&a[8];

while(--pc>a)putchar(pc);putchar(′\n′);

return0;

}

(9)

#include

#defineN2

#defineM5

intmain()

{

charc[N][M]{"1357","2468"},p[2];

inti,j,k=0;



for(i=0;i
for(i=0;i
for(j=0;p[i][j]>′\0′&&p[i][j]<=′9′;j+=2)

k=10k+p[i][j]-′\0′;

printf("%d\n",k);

return0;

}

(10)

#include

#defineN3

#defineM4

intmain()

{

inta[N][M]={1,3,5,7,9,11,13,15,17,19,21,23};

int(p){M==a,i,j,k=0;

for(i=0;i
for(i=0;i
for(j=0;j
printf("%d",k+((p+1)+j));

return0;

}

(11)

#intlude

intmain()

{

inta[3]=[3]={{1,2,3},{4,5,6},{7,8,9}}

intpa[3];

intp=&a[0]=[0]=;

intpp;

pa[0]=a[0];

pa[0]=a[0]=+1;

pa[2]=a[0]+2;

pp=pa;

printf("%3d",a[2]);

printf("%3d",((a+1)+1));

printf("%3d",pa[1]);

printf("%3d",p[1]);

printf("%3d",pp[1][2]);

return0;

}

(12)

#include

intmain()

{

charc[]={"ENTER","NEW","POINT","FIRST"};

charpc[]={c+3,c+2,c+1,c};

charppc=pc;

printf("%s\n",++ppc);

printf("%s\n",--++ppc+3);

printf("%s\n",ppc[-2]+3);

printf("%s\n",ppc[-1][-1]+1);

return0;

}

6.6

(1)想输出数组a的10个元素,用以下程序是否可行?为什么?

#include

main()

{

inta[10]=={1,2,3,4,5,6,7,8,9,10},i;

for(i=0;i<10;i++,a++)

printf("%d",a);

}

#include

main()

{

inta{10=={1,2,3,4,5,6,7,8,9,10},i,p=a;

for(i=0;i<10;i++,p++)

printf("%d,",p);

}

(2)想输出数组a的10个元素,用以下程序是否可行?请与上题对比并进行分析,得到必

#include

print_arr(inta[],n)

{

inti;

for(i=0;i
printf("%d",a);

}

main()

{

intarr[10]={1,2,3,4,5,6,7,8,9,10};

printarr(arr,10);

}

6.7有一个数列,含有20个整数,现要求编写一个函数,能够对从指定位置开始的几个数按相反顺序重新排列,并在main函数中输出新的数列。例如,原数列为



#include

voidresort(int[],int,int);

intmain(void)

{

voidresort(intarray[],intwhere,intamount);

intnumber[20],where,amount,i;

printf("input20numbers\n");

for(i=0;i<20;i++)

scanf("%d",&number[i]);

printf("\n");

printf("howmanynumbersdoyouwanttosort:");

scanf("%d",&amount);

printf("\nwheredoyouwanttostart:");

scanf("%d",&where);

printf("\n");

printf("oldarrayasfollow:\n");

for(i=0;i<20;i++)

printf("%d,",number[i]);

printf("\n");

resort(number,where,amount);

printf("\nresortedarrayasfollow:\n");

for(i=0;i<20;i++)

printf("%d,",number[i]);

printf("\n");

return0;

}

voidresort(intarray[],intwhere,intamount)

{

intp1,p2,temp;

p1=&array[where–1];

p2=&array[where-2+amount];

for(;p1<&array[where-1]+amount/2;p1++,p2--)

{

temp=p1;

p1=p2;

p2=temp;

}

}



6.8有n个人围成一圈,顺序排号,从第1个人开始报数,从1报到5,凡是报到5的人退出圈子,问最后留下的是原来第几序号的人?要求如下。



#include

intmain(void)

{

voidnumOffLeave(intp,intn);

intnum[100],n,i;

printf("howmanypeople?\n");

scanf("%d",&n);

for(i=0;i
num[i]=i+1;

numOffLeave(num,n);

for(i=0;i
if(num[i]!=0)

printf("No.whichleftlastis%d",num[i]);

return0;

}

voidnumOffLeave(intp,intn)

{

inti,out,count;



i=0;

out=0;

count=0;



while(out
{

if((p+i)!=0)

count++;

if(count==5)

{

(p+i)=0;

count=0;

out++;

}

i++;

if(i==n)i=0;

}

}

6.9有一个二维数组a,大小为3×5。其元素为



#include

intmain(void)

{

voidmaxval(intarr[][4],intm,intn};/函数声明/intarray[3][4],i,j,l,c;

/输入数组大小/

printf("inputlinesofarray:");

scanf("%d",&l);

printf("\ninputcolumnofarray:");

scanf("%d",&c);/输入数据/

printf("\ninputdatausecommabetweendata\n");

for(i=0;i
for(j=0;j
scanf("%d,",&array[i][j]);

printf("\n");/显示数组的结构形式/

for(i=0;i
{

for(j=0;j
printf("%4d",array[i][j]);

printf("\n");

}

/调用函数计算最大元素/

maxval(array,l,c);

return0;

}

voidmaxval(intarr[]4],intm,intn)

{

inti,j,max,line=0,col=0;

int(p)[4];

max=arr[0][0];

p=arr;

/穷举最大元素/

for(i=0;i
for(j=0;j
if(max<((p+i)+j))

{

max=((p+i)+j);

line=i;

col=j;

}

/输出结果/

printf("\nthemaximumvalueis%d",max);

printf("\nthelineis:%d",line);

printf("nthecolumnis:%d\n",col);

}

6.11有n个学生,每个学生参加m门课程的考试,要求编写一函数,能检查n个学生有无不及格的课程。如果某一学生有一门或一门以上的课程不及格,就输出该学生的学号(学号从0算起,即0,1,2,…)及其全部课程成绩。



#include

intmain(void)

{

voidsearch(float(p)[4],intm};

floatscore[5][4]{{65,80,78,90},{98,59,100,83},{92,66,78,70},{78,58,80,77},{64,68,70,81}};

search(score,5);

return0;

}

voidsearch(float(p)[4],intm)

{

inti,j,flag;

for(i=0;i
{

flag=0;

for(j=0;j<4;j++)

if(((p+i)+j)<60)flag=1;

if(flag==1)

{

printf("No.%disflunked,scoresare:\n",i);

for(j=0;j<4;j++)

printf("%5.1f",((p+i)+j));

printf("\n");

}

}

}

6.12输入3行字符(每行60个字符以内),要求统计出其中共有多少大写字母、小写字母、空格及标点符号。



#include

#include

intmain(void)

{

charstr[3][60](p)[60];

inti,j,up,low,space,comma;

up=0;low=0;space=0;comma=0;

printf("inputthreestrings\n");

for(i=0;i<3;i++)

gets(str[i]);

p=str;

for(i=0;i<3;i++)

for(j=0;j
{

if(((p+i)+j)>=′a′&&((p+i)+j)<=′z′)low++;

elseif(((p+i)+j)>=′A′&&((p+i)+j)<=′Z′)up++;

elseif(((p+i)+j)==′,′)comma++;

elseif(((p+i)+j)==′′)space++;

}

printf("low=%dup=%dspace=%dcomma=%d",low,up,space,comma);

return0;

}

6.13指出下面程序中的错误,并分析出错的原因。

6.14建立一个动态二维数组,用来存储1~10的1~4次幂。

参考程序代码如下。

#include

#include

intpower(int,int);

intmain(void)

{

intp[4][10];

registerinti,j;

if(!p)

{

printf("Memoryrequestfailed!\n");

exit(1);

}

for(j=1;j<11;j++)

{

for(i=1;i<5;i++)

printf("%10d",p[i-1][j-1]=powr(j,i));

printf("\n");

}

free(p);

return0;

}

intpower(intx,intn)

{

registerintt=1;

for(;n;n--)t=x;

returnt;

}



6.15有一个C语言源程序文件,名为echo,其内容如下。

#include

main(intargc,charargv[])

{

while(argc-->1)

printf("%s\n",++argv);

}



献花(0)
+1
(本文系liyi039首藏)