C语言小题,建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。(内存动态分配区,void指针)

前言:
此篇是针对 内存动态分配区void指针 方面的练习。

解题思路:
用 malloc 函数开辟一个动态自由区域,用来存5个学生的成绩,会得到这个动态域第1个字节的地址,它的基类型是 void 型。用一个基类型为 int 的指针变量 p 来指向动态数组的各元素,并输出它们的值,但必须先把 malloc 函数返回的 void 指针转换为整型指针,然后赋给 p1。

正文:

#include<stdio.h>
#include<stdlib.h>				//程序中用了malloc函数,应包含stdlib.h 
int main() {
	void check(int *);			//函数声明
	int *p1,i;					//p1是int型指针
	p1=(int *)malloc(5*sizeof(int)); //开辟动态内存区,将地址转换成int*型,然后放在p1中
	for(i=0; i<5; i++)
		scanf("%d",p1+i);		//输入5个学生的成绩
	check(p1);					//调用check函数
	return 0;
}

void check(int *p) {					//定义check函数,形参是int*指针
	int i;
	printf("They are fail:");
	for(i=0; i<5; i++)
		if(p[i]<60) printf("%d ",p[i]);	//输出不合格的成绩
	printf("\n");
}

程序分析:
在调用 malloc 函数时没有给出具体的数值,而是用 5 * sizeof(int),因为有5个学生的成绩,每个成绩不是一个整数,但在不同的系统中存放一个整数的字节数是不同的,为了使程序具有通用性,故用 sizeof 运算符测定在本系统中整数的字节数。调用 malloc 函数的返回值使 void * 型的,要把它赋给 p1,应先进行类型转换,把指针转换成 int * 型。用 for 循环输入5个学生的成绩,注意不是用数组名,而是按地址赋值给动态数组的5个元素。开始时 p1 指向第1个整型数据,p1+1 指向第2个整型数据……调用 check 函数时把 p1 的值传给形参 p ,因此形参 p 也指向动态区的第1个数据,可以认为形参数组与实参数组共享同一段动态分配区。都在 check 函数中,用下标形式使用指针变量 p ,逐个检查5个数据,输出不合格的成绩。最后用 free 函数释放动态分配区。

实际上,第6行可以直接写成

p1=malloc(5*sizeof(int)); //p1为整型指针,自动转换

因为在进行编译时,系统可以自动进行隐式的转换,而不必人为地进行显式的强制类型转换。但是有的程序员仍然习惯于进行显式的强制转换(他们认为这样规范,清晰)。

总结:
运行结果:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

超级Mr Yin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值