*p2){p=p1;p1=p2;p2=p;}/*指针变量p1和p2的值交换*/printf("" />
文档库 最新最全的文档下载
当前位置:文档库 › c语言一些例题及答案

c语言一些例题及答案

c语言一些例题及答案
c语言一些例题及答案

指针变量的引用:

相关运算符:&: 取地址运算符。

*:指针运算符。

练习1:int x=7,*p=&x;

则:&x对应p,*&x对应*p,x

x++对应(*p)++

练习2:输入a,b(int型)。按从小到大输出。

解法1:

main()

{int a,b;

int *p1=&a,*p2=&b,*p;

scanf("%d,%d",p1,p2);

if(*p1>*p2) {p=p1;p1=p2;p2=p;} /*指针变量p1和p2的值交换*/ printf("\n%d,%d",*p1,*p2);

printf("\n%d,%d",a,b);}

解法2:

main()

{int a,b,p,*p1=&a,*p2=&b;

scanf("%d,%d",p1,p2);

if(*p1>*p2) {p=*p1;*p1=*p2;*p2=p;} /* *p1和*p2交换*/

printf("\n%d,%d",*p1,*p2);printf(“\n%d,%d”,a,b);}

解法3:(指针变量做函数的参数)

swap(int *p1,int *p2)

{int c;

c=*p1;*p1=*p2;*p2=c;}

main()

{int a,b;

int *p3=&a,*p4=&b;

scanf("%d,%d",p3,p4);

if(*p3>*p4) swap(p3,p4);

printf("\n%d,%d",*p3,*p4);

printf("\n%d,%d",a,b);}

解法4:

swap(int *p1,int *p2)

{int *p;

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

main()

{int a,b;

int *p3=&a,*p4=&b;

scanf("%d,%d",p3,p4);

if(*p3>*p4) swap(p3,p4);

printf("\n%d,%d",*p3,*p4);printf("\n%d,%d",a,b);}

注意:

1)指针变量作函数参数是将一个变量的地址传送到另一个函数中,但仍采用“值”传递。

2)调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。如上例解法3。所以运用指针变量作参数,可以得到多个变化了的值。

练习3:输入两个正整数m和n,求其最大公约数。

main()

{int m,n,*p1=&m,*p2=&n,r;

scanf("%d,%d",p1,p2);

if(*p1<*p2){r=*p1;*p1=*p2;*p2=r;}

r=(*p1)%(*p2);

while(r!=0)

{m=n;n=r;r=m%n;}

printf("\n%d",*p2);}

上机1:对于任何一个大于3的正整数m,请用指针变量编程,判断其是否是素数。

练习4:阅读下列源程序

main()

{int a[10],*p,i;

p=a;

for(i=0;i<=9;i++) /*完成对a数组的赋值,且p值不变*/ scanf("%d",p+i);

printf("\n");

for(;p<(a+10);p++) /*完成对a数组的输出,且p值改变*/ printf("%8d",*p);}

练习5:排序问题(升序):(指向数组的指针变量做参数)

void sort(int *p,int n)

{int i,j,k,c;

for(i=0;i

{k=i;

for(j=i+1;j

if(p[k]>p[j]) k=j; /或:if(*(p+k)>*(p+j)) k=j;

if(k!=i){c=p[k];p[k]=p[i];p[i]=c;}}}

main()

{int x[100],m,i1,*p=x;

scanf("%d",&m);

for(i1=0;i1

scanf("%d",&x[i1]);

sort(p,m); /*调用排序函数*/

printf("\n");

for(i1=0;i1

printf("%8d",x[i1]);}

注意:

1)形参和实参都用数组名;传地址

2)实参用数组名,形参用指针变量;数组名代表的地址-→形参3)实参、形参都用指针变量:传值(地址)

4)实参为指针变量,形参为数组名:实参的值-→形参数组名

例6:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现

以上功能,在主函数中输入n个整数和输出调用后

的n个数。

main()

{ int x[20],i,n,m;

scanf("%d,%d",&n,&m);

for(i=0;i<=n-1;i++)

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

f(x,n,m);printf("\n");

for(i=0;i

printf("%8d",x[i]);}

f(int y[],int n,int m)

{int c,j1,j2;

for(j1=1;j1<=m;j1++)

{c=y[n-1];

for(j2=n-1;j2>=1;j2--)

y[j2]=y[j2-1];

y[0]=c;}}

思考:将其改为用指针变量编程(上机2)

1.指向多维数组的指针和指针变量:

思考题:int x[3][4];

则:&x[0][0]对应x[0]及*(x+0)

&x[0][1]对应x[0]+1及*(x+0)+1

&x[0][i]对应x[0]+i及*(x+0)+i

&x[i][j]对应x[i]+j及*(x+i)+j

x[i][j]对应*(*(x+i)+j)及*(x[i]+j)

例7:阅读下列源程序,

main()

{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},*p,i,j;

for(p=a[0];p

{if((p-a[0])%4==0) printf("\n");

printf("%6d",*p);}

/* p=a[0];scanf("%d,%d",&i,&j);printf(“\n%d”,*(p+i*4+j));*/ }

例8:阅读下列源程序,体会p的作用。

main()

{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},i,j;

int (*p)[4]; /*定义行指针变量*/

p=a;

scanf("%d,%d",&i,&j);printf("%d\n",*(*(p+i)+j));}

行指针变量的定义格式:类型标识符(*指针变量名)[列数];行指针变量:指向由m个数组成的一维数组的指针变量。

练习2:阅读下列源程序,写出运行结果。1:

main()

{int arr[]={6,7,8,9,10};

int *ptr=arr;

*(ptr+2)+=2;

printf("%d,%d\n",*ptr,*(ptr+2));}

2.

int fun(int x,int y,int *cp,int *dp) {*cp=x+y;*dp=x-y;}

main()

{int a,b,c,d;

a=30;b=50;

fun(a,b,&c,&d);

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

3.

int a[]={2,4,6,8};

{int *p=a,i;

for(i=0;i<4;i++) a[i]=*p++;

printf("%d\n",a[2]);}

二.字符串的指针和指向字符串的指针变量1.字符串的表示形式:

1)用字符数组

2)用字符指针实现

如:main()

{char *string=”abcdfeghktjre”;

printf(“%s\n”,string);}

例9.完成字符串的复制

解法1:

#include

main()

{char c[20],b[20],*p1=c,*p2=b ;

int i;

gets(p1);

for(i=0;*(p1+i)!='\0';i++)

*p2++=*(p1+i);

*p2='\0';

printf("\nstring1=%s,string2=%s",p1,p2);} 解法2:用字符数组做参数

#include

void f(char c1[],char b1[])

{int i;

for(i=0;c1[i]!='\0';i++)

b1[i]=c1[i];

b1[i]='\0';}

main()

{char c[20],b[20] ;

gets(c);

f(c,b);

printf("\nstring1=%s,string2=%s",c,b);} 解法3:用字符指针变量做形参

#include

void f(char *p1,char *p2)

{for(;*p1!='\0';p1++)

*p2++=*p1;*p2='\0';}

main()

{char c[20],b[20] ;

gets(c);

f(c,b);

printf("\nstring1=%s,string2=%s",c,b);}

习题7。输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

#include

main()

{char c;

int n1=0,n2=0,n3=0,n4=0;

while((c=getchar())!='\n')

if(c>='A'&&c<='Z'|| c>='a'&& c<='z') n1++;

else if(c==' ') n2++;

else if(c>='0'&& c<='9') n3++;

else n4++;

printf("\nn1=%d,n2=%d,n3=%d,n4=%d\n",n1,n2,n3,n4);}

}

习题8:请编程输出一数列,已知第一,第二个数都是1,从第三个数开始,每个数都是与其相邻的前两个数之和,求这一数列,直到其数不小于105

main()

{long a=1,b=1,c;

printf("\n%8ld",a);

while(b<=1e+5)

{printf("%8ld",b);

a=a+b; c=a;a=b;b=c;}}

相关文档