一、实验目的
- 了解开发环境
- 学习如何编辑、编译、连接和运行c程序
- 了解并掌握指针的定义、申明及调用规则
- 理解指针的应用
二、实验内容
【项目1—读程序】阅读下面的程序,体会指针的应用。请自己画出内存的示意图,加深体会
1.
#include <stdio.h>
int main()
{
int a,b;
int *p1,*p2;
a = 100;
b = 10;
p1 = &a;
p2 = &b;
printf("%d %d\n",a,b);
printf("%d %d\n",*p1,*p2);
return 0;
}
实验结果:
#include <stdio.h>
int main()
{
int a,b,*p1,*p2,*p;
scanf("%d %d",&a,&b);
p1 = &a;
p2 = &b;
if(a<b)
{
p = p1;
p1 = p2;
p2 = p;
}
printf("a=%d b=%d\n",a,b);
printf("max=%d min=%d\n",*p1,*p2);
return 0;
}
若输入a,b的值为1和2,则会用交换指针而不改变ab的值,最后输出a=1,b=2
max=2,min=1
运行截图:
- 读以下程序,有无错误,为什么,请修改让程序能正常运行
#include <stdio.h>
int main()
{
int a,b,*p1,*p2;
scanf("%d %d",&a,&b);
*p1 = 10;
*p2 = 100;
printf("%d %d\n",a,b);
printf("%d %d\n",*p1,*p2);
return 0;
}
分析错误的原因:
指针p1和p2没有明确指向哪里,是一个野指针。直接给p1和p2赋值,不能达到给ab赋值的目的,还会有改变其他数据的风险。
修改后的程序:
#include<stdio.h>
int main()
{
int a,b;
int *p1,*p2;
p1=&a;
p2=&b;
*p1=10;
*p2=100;
printf("%d %d\n",a,b);
printf("%d %d\n",*p1,*p2);
return 0;
}
- 阅读程序,判断预期的输出并上机验证
#include <stdio.h>
void main()
{
int i, m[]={0,1,2,3,4,5,6,7,8,9};
int *p=m+3;
// 分析每一句的表达式输出
// 写出每一句的预期与实际结果 判断输出 实际输出
printf("1. %d\n", *p); ( 1. 3 ) ( 1. 3 )
printf("2. %d\n", ++*p); ( 2. 4 ) ( 2. 4 )
printf("3. %d\n",*p); ( 3. 4 ) ( 3. 4 )
printf("4. %d\n",*++p); ( 4. 4 ) ( 4. 4 )
printf("5. %d\n",*p); ( 5. 4 ) ( 5. 4 )
printf("6. %d\n",*p++) ; ( 6. 4 ) ( 6. 4 )
printf("7. %d\n",*p); ( 7. 5 ) ( 7. 5 )
printf("8. %d\n",(*p)++); ( 8. 5 ) ( 8. 5 )
printf("9. %d\n",*p); ( 9. 6 ) ( 9. 6 )
p+=2;
printf("10. %d\n",*p); ( 10. 7 ) ( 10. 7 )
p=&m[6];
printf("11. %d\n",*p); ( 11. 6 ) ( 11. 6 )
i=*p+4;
printf("12. %d\n",i); ( 12. 10 ) ( 12. 10 )
i=*(p-=3);
printf("13. %d\n",i); ( 13. 3 ) ( 13. 4 )
printf("14. %d\n",*p); ( 14. 3 ) ( 14. 4 )
*(p++)=9;
printf("15. %d\n",*p); ( 15. 4 ) ( 15. 4 )
printf("16. %d\n",*(p+1)); ( 16. 5 ) ( 16. 6 )
}
实验结果截图:
- 体会指针作为函数的参数的使用
#include <stdio.h>
void fun(int x,int y,int *z)
{
*z = x*X + y*y;
}
int main()
{
int a = 31;
fun(5,2,&a);
printf("%d\n",a);
return 0;
}
fun不返回函数用第三个参数的指针保存前两个参数的平方和带回到main主函数后输出,输出结果为:29
实验结果截图:
【项目2—程序填空】
下面的程序,请将程序补充完整。
#include <stdio.h>
void bubblesort(_____, _____);
int main( )
{
int i,a[10]= {3,5,9,1,3,6,-9,-7,10,12};
bubblesort(_____,_____);
for(i=0; i<10; i++)
printf("%d ", a[i]);
return 0;
}
void bubblesort(_____, _____)
{
int i,j,t;
for (i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if (*(p+j)>*(p+j+1))
{
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
return;
}
添加后的代码:
#include <stdio.h>
void bubblesort(int n, int *p);
int main()
{
int i,a[10]= {3,5,9,1,3,6,-9,-7,10,12};
bubblesort(10,a);
for(i=0; i<10; i++)
printf("%d ", a[i]);
return 0;
}
void bubblesort(int n, int *p)
{
int i,j,t;
for (i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if (*(p+j)>*(p+j+1))
{
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
return;
}
运行结果:
【项目3—编程题】
- 请阅读以下程序,然后将函数调用方式改为指针操作,达到交换数据的目的,你能写出几种写法就写几个程序在下面
#include <stdio.h>
void myswap(int x,int y)
{
int t;
t = x;
x = y;
y = t;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("调用前:%d %d\n",a,b);
myswap(a,b);
printf("调用后:%d %d\n",a,b);
return 0;
}
原程序不能实现交换a、b的值,因为void是无返回型函数,交换的只是局部变量。
修改后的代码:
#include<stdio.h>
void myswap(int *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("调用前: %d %d\n",a,b);
myswap(&a,&b);
printf("调用后: %d %d\n",a,b);
return 0;
}
数组实现交换,代码:
#include<stdio.h>
void myswap(int x[])
{
int t;
t=x[0];
x[0]=x[1];
x[1]=t;
}
int main()
{
int a[2]={};
scanf("%d %d",&a[0],&a[1]);
printf("调用前: %d %d\n",a[0],a[1]);
myswap(a);
printf("调用后: %d %d\n",a[0],a[1]);
return 0;
}
交换指针实现,代码:
#include<stdio.h>
int main()
{
int a,b,*p1,*p2,*p;
scanf("%d %d",&a,&b);
p1=&a;
p2=&b;
printf("调用前: %d %d\n",*p1,*p2);
p=p1;
p1=p2;
p2=p;
printf("调用后: %d %d\n",*p1,*p2);
return 0;
}
2. 用指针法输入 12 个数,然后按每行 4 个数输出。所有操作利用指针进行完成。
算法分析:
定义一个整型数组和一个整型指针,这样通过数组就可以静态分配内存空间,存储数据;然后将指针与数组相关,使指针指向与数组相同的首地址处,这样就可以通过指针对数组的存储空间加以操作。
一维数组:
#include<stdio.h>
int main()
{
int a[12],*p=a,i;
for(i=0;i<12;i++)
scanf("%d",p++);
p=a;
for(i=0;i<12;i++)
{
printf("%d\t",*p++);
if((i+1)%4==0)
printf("\n");
}
return 0;
}
二维数组:
#include <stdio.h>
int main( )
#include <stdio.h>
int main( )
{
int a[3][4]={},*p,k=0;
for(p=a[0]; p<a[0]+12; p++)
{
scanf("%d",p);
}
for(p=a[0]; p<a[0]+12; p++)
{
printf("%d\t",*p);
k++;
if(k%4==0)
printf("\n");
}
return 0;
}