前言:
此篇是针对 内存动态分配区 和 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为整型指针,自动转换
因为在进行编译时,系统可以自动进行隐式的转换,而不必人为地进行显式的强制类型转换。但是有的程序员仍然习惯于进行显式的强制转换(他们认为这样规范,清晰)。
总结:
运行结果: