指针
实验目的
1.掌握指针的概念、指针变量的定义及初始化
2.掌握指针作为函数参数的方法
3.掌握函数的指针及其应用
实验条件:
PC 计算机,Windows7 或 Windows10 操作系统,Office2010 及以上版本,
Dev-C++5.11 及以上版本或 Code Blocks16.01 及以上版本。
实验内容
1.程序调试
利用指针找最大值:利用指针指向两个整型变量,并通过指针运算找出两个
数中的最大值,输出到屏幕上。
#include<stdio.h>
int main()
{
int max, x, y, *pmax, *px, *py;
scanf("%d %d",&x, &y);
*px = &x;
*py = &y;
*pmax = &max;
*pmax = *px; //调试断点设置
if(pmax<py)
{
pmax=py;
}
printf("max=%d\n", max);
return 0;
}
(1)编译后共有 3 个 Warning,错误显示“warning: assignment makes integer
from pointer without a cast”,分析原因,将整型地址赋值给整型变量,类型不匹
配,应修改为诸如 px=&x。如图 8.1 所示。
图 8.1 程序语法错误
(2)修改错误,重新编译,没有错误信息,运行程序,输入 2 和 5,程序
运行结果如图 8.2 所示。显然程序运行结果不对。
思考:如果输入顺序是 5 和 2,程序运行结果会怎样?从中你得到什么启
示?
图 8.2 程序运行结果
(3)按程序所示设置一个断点,启动程序调试。输入 2 和 5 后,程序执行
到断点处。单击“添加查看”按钮,分别输入 9 个观察量 x,y,max,&x,&y,
&max。左边的调试观察窗口内容表明,三个指针变量已经分别指向了变量 x,
y,max。如图 8.3 所示。
图 8.3 查看指针变量的值
(4)连续单击“下一步”按钮,发现箭头跳过语句“pmax=py;”指向了输出语
句,但测试数据 x 为 3,y 为 5,x 小于 y,程序执行流程与实际不符,显然 if 语句的条件表达式错误。仔细分析源程序,发现 if 语句的条件表达式操作的是指针
变量的值,而本程序应该操作的对象应该是指针变量指向的值,因此应做如下修
改:
if(*pmax<*py)
{
*pmax=*py;
}
(5)单击“停止执行”按钮,结束程序调试。修改上述错误后重新编译程
序,再次启动程序调试,重新输入测试数据 2 和 5。继续单击“下一步”按钮 3
次,程序运行到输出语句,调试观察窗口中显示 pmax 指针所指向的 max 变量已
经被 x 和 y 中较大的那个值替代,符合要求。如图 8.4 所示。结束调试。
图 8.4 修改后查看指针变量的值
#include<stdio.h>
int main()
{
int max, x, y, *pmax, *px, *py;
scanf("%d %d",&x, &y);
px = &x;
py = &y;
pmax = &max;
*pmax = *px;
if(*pmax<*py)
{
*pmax=*py;
}
printf("max=%d\n", max);
return 0;
}
2.基础编程
(1)使用如下 Swap 函数,用函数编程实现两个数组中对应元素的交换。假设
数组元素不超过 10 个,具体个数有用户输入。
void Swap(int *x, int *y)
{
int temp;
temp=*x;
*x = *y;
*y = temp;
}
输入提示:”Please input the number of array (n<=10):\n”
”Please input the first array:\n”
”Please input the second array:\n”
输入格式:数组元素个数:”%d”
数组元素:”%d”
输出提示:” \n The first array you input:\n”
“\n The second array you input:\n”
” \n The first array after swap:\n”
“\n The second array after swap:\n”
输出格式:”%4d”
(2)调用函数求两个数的和与差。要求自定义一个函数一次性计算两个浮
点数的和与差。
函数原型: void sum_diff( float op1, float op2, float *psum, float *pdiff );
其中 op1 和 op2 是输入的两个实数,*psum 和 *pdiff 是计算得出的和与差。
输入提示:”Please input two float number:\n”
输入格式:”%f,%f”
输出格式:”sum= %.2f, difference= %.2f ”
运行示例:
Please input two float number:
3.5,7.5↙
sum= 11.00, difference= -4.00
#include<stdio.h>
void
swap(int *a,int *b);
void swapArray(int *a,int *b,int n);
void InputArray(int a[],int n);
void printArray(int a[],int n);
int main()
{
printf("Please input the number of array(n<=10):\n");int n;
scanf("%d",&n);
printf("Please input the first array:\n");
int array1[n];
InputArray(array1,n);
printf("Please input the second array:\n");
int array2[n];
InputArray(array2,n);
printf("\n The first array you input:\n");
int i=0;
for(i=0;i<n;i++)
{
printf("%d ",array1[i]);
}
printf("\n The second array you input:\n");
int j=0;
for(j=0;j<n;j++)
{
printf("%d ",array2[j]);
}
swapArray(array1,array2,n);
printf("\n The first array after swap:\n");
int k=0;
for(k=0;k<n;k++)
{
printf("%d ",array1[k]);
}
printf("\n The second array after swap:\n");
int g=0;
for(g=0;g<n;g++)
{
printf("%d ",array2[g]);
}
return 0;
}
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void swapArray(int *a, int *b,int n)
{
int i;
for(i=0;i<n;i++)
{
swap(a,b);
a++;
b++;
}
}
void InputArray(int a[],int n)
{
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
(3)拆分实数的整数与小数部分。要自定义一个函数,同时返回拆分后的
整数部分和小数部分。
函数原型:void splitfloat( float x, int *intpart, float *fracpart );
其中 x 是被拆分的实数,intpart 和fracpart 分别是将实数 x 拆分出来的整
数部分和小数部分。
输入提示:”Please input a float number:\n”
输入格式:” %f”
输出格式:
整数部分:”The intpart is %d\n ”
小数部分:”The fractpart is %.4f\n ”
运行样例:Please input a float number:
3.1415↙
The intpart is 3
The fractpart is 0.1415
#include<stdio.h>
#include<math.h>
void splitfloat(float x,int *inpart,float *fracpart);
int main()
{
printf("Please input a float number:\n");
float x,frac_data;
scanf("%f",&x);
int *inpart,int_data;
float *fracpart; inpart = &int_data;
fracpart = &frac_data;
splitfloat(x,inpart,fracpart);
printf("The
intpart is %d\n ",int_data);
printf("The
fractpart is %.4f\n ",frac_data);
return 0;
}
void splitfloat(float x,int *inpart,float *fracpart)
{
*inpart = (int)x;
*fracpart = x - *inpart;
}