实验7 指针
一、实验目的和要求
1.掌握指针和指针变量。
2.掌握指针与变量的关系。
3.掌握指针与数组的关系。
4.掌握指针运算。
5.掌握指向数组的指针变量的使用。
二、实验内容和步骤
1.下面的程序通过指针变量改变所指变量的值。
main()
{
int a,b,*pa,*pb,*p;
/*pa指向a*/
/*pb指向b*/
scanf("%d,%d",pa,pb);
if(*pa>*pb)
{ }/*pa和pb交换指向*/
printf("%d<=%d\n",*pa,*pb);
}
(1)该程序的主要功能是什么?
(2)分析并把程序补充完整。
(3)写出程序的运行结果。
(4)如果不改变指针指向,如何交换a、b的值,请写出程序的代码。
2.有程序如下:
#include <stdio.h>
main()
{
int a[10];
int *p1,*p2,x,i;
for(i=0,p1=a;i<10;i++)
scanf("%d",p1+i);
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");
for(p1=a,p2=a+9;p1<a+4;p1++,p2--)
{
x=*p1;
*p1=*p2;
*p2=x;
}
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");
}
(1)写出该程序的主要功能。
(2)指针变量的主要作用是什么?
(3)分析指针与数组的关系。
(4)写出程序的运行结果。
3.要使指针变量pt1指向a和b中的大者,pt2指向小者,以下程序能否实现此目的?
swap(int *p1,int *p2)
{
int *p;
p=p1;p1=p2;p2=p;
}
main()
{
int a,b;
scanf("%d,%d",&a,&b);
pt1=&a;pt2=&b;
if(a<b)
swap(pt1,pt2);
printf("%d,%d\n",*pt1,*pt2);
}
上机调试此程序。如果不能实现题目要求,指出原因,并修改之。
4.分析下面程序。
#include <stdio.h>
#include <string.h>
main()
{
char *p;
char ch;
printf("capital or uncapital( c )?:");
ch=getchar();
if(ch=='c')
strcpy(p,"COMPUTER");
else
strcpy(p,"computer");
puts(p);
}
调试程序,指出错误并改正。
5.分析下面程序,并写出其主要功能。
#include <stdio.h>
void main()
{
char *str[]={"ENGLISH","MATH","MUSIC","PHYSICS","CHEMISTRY"};
char **q;
int num;
q=str;
for(num=0;num<5;num++)
printf("%s\n",*(q++));
}
6.分析下面程序。
#include <stdio.h>
int*findmax(int *s,int t,int *k)
{
int i,*p;
p=s;
for(i=1;i<t;i++)
if(*p<s[i])
{
}
return p;
}
main()
{
int a[10]={10,25,34,40,55,68,78,99,100,20},k,*add;
add=findmax(a,10,&k);
printf("%d,%d,%x\n",a[k],k,add);
}
(1)分析程序,写出程序的主要功能。
(2)把程序补充完整。
(3)写出指针作为函数的参数的作用。
7.编写一个函数s(a,n),其中a是一个一维整型数组,n是数组长度,通过指针求数组中的平均数。
8.利用指针编写程序,求字符串的长度。
9.输入10个实数,利用指针求其中的最大值和平均值。
10.输入10个数,将其从大到小排序。
11.假如本程序文件名为lab711,使用命令“lab711 book this hello”执行下面程序,输出结果是什么?
#include <string.h>
#include <stdio.h>
main(int argc,char *argv[])
{
void sort(char *s[],int n);
char **p;
sort(argv+1,argc-1);
for(p=argv+1;argc--;p++)
printf("%s\n",*p);
}
void sort(char *w[],int n)
{
int i,j;
char word[20];
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(strcmp(w[i],w[j])>0)
{
strcpy(word,w[i]);
strcpy(w[i],w[j]);
strcpy(w[j],word);
}
}
对应答案:实验7 指针
1.参考答案
(1)程序的主要功能是:从键盘上输入两个数据,并从小到大输出。
(2)补充程序如下。
main()
{
int a,b,*pa,*pb,*p;
pa=&a; /*pa指向a*/
pb=&b; /*pb指向b*/
scanf("%d,%d",pa,pb);
if(*pa>*pb)
{p=pa;pa=pb;pb=p;} /*pa和pb交换指向*/
printf("%d<=%d\n",*pa,*pb);
}
(3)运行结果
7,4↙
4<=7
(4)先定义一个临时变量temp:
int temp;
temp=*pa;*pa=*pb;*pb=temp;
2.参考答案
(1)程序的主要功能:从键盘上输入10个数据存放到一维数组中,逆序后输出。
(2)指针变量的主要作用:快速的访问数组的数据元素。
c语言指针实验总结(3)分析指针与数组的关系:用指针变量指向数组,通过对指针变量的操作,来改变数组元素,方便、快捷。
(4)运行结果
1 3 56 7 8 45 2 4 5 67↙
1 3 56 7 8 45 2 4 5 67
67 5 4 2 45 8 7 56 3 1
3.参考答案
不能实现此目的。原因是因为在swap()中,只改变了指针指向,并没有对数据内容发生改变。可以将swap()函数改为:
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
4.参考答案
程序的错误在于:p指针在赋值以前,没有为其分配内存空间。应该改为:
#include <stdio.h>
#include <string.h>
main()
{
char *p,array[20];
char ch;
p=array;
printf("capital or uncapital( c )?:");
ch=getchar();
if(ch=='c')
strcpy(p,"COMPUTER");
else
strcpy(p,"computer");
puts(p);
}
5.参考答案
程序的主要功能是:用字符指针数组存放5个字符串,然后用指向指针的指针p一一访问该数组,并输出所指向的字符串。
6.参考答案
(1)程序的主要功能:该程序的主要功能为从一个数组中查出最大值,并把其在数组中的位置(从零开始)和内存地址显示出来。
(2)完整的程序如下。
#include <stdio.h>
int *findmax(int *s,int t,int *k)
{
int i,*p;
p=s;
for(i=1;i<t;i++)
if(*p<s[i])
{
p=s+i;
*k=i;
}
return p;
}
main()
{
int a[10]={10,25,34,40,55,68,78,99,100,20},k,*add;
add=findmax(a,10,&k);
printf("%d,%d,%x\n",a[k],k,add);
}
(3)指针作为函数的参数的作用:指针作为函数参数,可以使实参和形参有一个共同指向,对形参改变的同时也能影响实参值。
7.参考程序
float ave(int a[],int n)
{
int s=0,i;
for(i=0,p=a;i<n;i++,p++)
{
s+=*p;
}
return (float)s/n;
}
8.参考程序
int strlen(char *s)
{
int d=0;
while(*s!='\0')
{
d++;
s++;
}
return d;
}
9.参考程序
#include <stdio.h>
void find_maxave(double arr[],double *max,double *ave,int n)
{
int i;
double *p,sum=0.0;
p=arr;
for(i=0;i<n;i++)
{
sum+=arr[i];
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论