当前位置:文档之家› 实验7 指针习题及参考答案

实验7 指针习题及参考答案

上机实验十指针
一.目的要求
1.掌握指针的基本概念;
2.掌握指针变量的定义和初始化;
3.掌握用下标、数组名或指针等不同方式引用数组元素;
4.掌握数组名作函数参数的方法;
5.请添加签名,本实验均用指针方法处理。

二.实验内容
【实验题1】
1)程序填空,交换指针p1,p2所指向的变量。

(10 分)
# include <stdio.h>
void main ( )
{
int a=1,b=2, *p1, *p2, pt;
p1=&a; p2=&b;
printf(“*p1=%d, *p2=%d \n”, *p1,*p2);
pt=p1 ; p1=p2 ; p2=pt ;//交换指针变量p1,p2所指向的变量printf(“*p1=%d, *p2=%d \n”,*p1,*p2);
}
运行结果:
2)程序填空,交换指针p1,p2所指变量的值。

# include <stdio.h>
void main ( )
{ int a=1,b=2, *p1, *p2, temp;
p1=&a; p2=&b;
printf(“*p1=%d, *p2=%d \n”, *p1,*p2);
temp=*p1 ; *p1=*p2 ; *p2=temp ;///交换指针p1,p2所指变量的值
printf(“*p1=%d, *p2=%d \n”, *p1,*p2);
}
运行结果:
【实验题2】程序填空:输入三个整型变量i,j,k的值。

请设置三个指针变量p1,p2,p3,分别指向i,j,k。

然后通过p1,p2,p3使i,j,k三个变量的值依次交换,即原来i的值赋给j, 原来j的值赋给k, 原来k的值赋给i。

输出交换后i,j,k的值。

(10 分)
i j
k
分析:三个值轮换跟两个值互换是一样的原理,在变量被赋新值之前必须保证原值已经被保存。

设temp 为临时变量,则temp=i; i=k; k=j; j=temp ,参考以上做法,轮换时要求用指针p1,p2,p3来替代i,j,k. 源程序:
#include <stdio.h>
void main ( )
{ int i,j,k,temp, *p1=&i ,*p2=&j,*p3= &k ;
printf("Input i j k: "); scanf("%d%d%d",&i,&j,&k); //输入i j k
//i-->j-->k-->i
temp=*p1 ;
*p1=*p3 ;
*p3=*p2 ;
*p2= temp;
printf("%d %d %d \n", *p1,*p2, *p3);//输出轮换后的i j k
}
输入:1 2 3
输出:
【实验题3】程序填空:输入三个整数,要求设计2个指针变量p1,p2 ,使p1指向这三个数的最大值,p2指向最小者 ,并输出最大值和最小值。

(10 分)
# include <stdio.h>
void main ( )
{ int a,b,c, *p1, *p2, *p3;
scanf(“%d%d%d”,&a,&b,&c);
// 令p1指向最大值
p1=(a>b)?&a:&b ; //p1指向a,b中较大者
if(*p1<c ) p1=&c;
//令p2指向最小值
p2=(a<b)? &a:&b ; //p2指向a,b中较小者
if(*p2 >c ) p2=&c;
printf(“max=%d, min=%d”, *p1,*p2 );
printf("Hello,c\n" );
}
运行结果:输入1 2 3
输出
【实验题4】程序填空:请用下标、数组名、指针等不同方法来输出数组元素。

(10 分)
方法1:用下标引用数组元素,源程序如下:
#include <stdio.h>
void main ( )
{ int i, a[5]={1,2,3,4,5};
for( i=0 ; i<5 ; i++ )
printf("%d ", a[i] );
printf("\n");
printf(“Hello.c!\n”);
}
方法3:用指针和下标引用数组元素,源程序如下:#include <stdio.h>
void main ( )
{ int i, a[5]={1,2,3,4,5}, *p;
for( p=a , i=0 ; i<5 ; i++ )
printf("%d ",*(p+i) );
printf("\n");
printf(“Hello.c!\n”);
}
由此可见,若指针p=a, 则a[i]≡*(a+ i )≡*(p+ i )≡
&a[i]≡a+ i ≡p+ i
而对指针p进行自增或自减运算,意味着移动指针,即 p++ 表示令指针p指向下(上/下)一个元素,而p-- 表示令指针p指向上(上/下)一个元素。

统一结果为下图:
【实验题5】利用指针,将数组a中的10个整数按相反顺序存放.源程序如下:(10 分)
#include <stdio.h>
void main ( )
{
int i,t, a[10],*p,*q;
printf("Input 10 integers:");
for(i=0; i<10; i++) scanf("%d", &a[i] );
p= a ; q= a+9 ; //p指向首元素,q指向最后一个元素
for( ; p<=q ; p++ , q-- ){ //逐对交换对称元素t= *p; *p= *q; *q=t;
}
for(i=0; i<10; i++) printf("%d ", a[i] );
printf("\n");
printf("Hello,C!\n");
}。

相关主题