C语言实验指针

指针

实验目的
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; 
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xlorb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值