动态内存分配与指向它的指针变量

1 什么是内存的动态分配

2 怎样建立内存的动态分配

3 void指针类型

1 什么是内存的动态分配

非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域
C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆区

2 怎样建立内存的动态分配

对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这4个函数。

malloc函数

其函数原型为
void *malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间
函数的值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置

malloc(100);
开辟100字节的临时分配域,函数值为其第1个字节的地址 

注意指针的基类型为void,即不指向任何类型的数据,只提供一个地址
如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)

calloc函数

其函数原型为
void *calloc(unsigned n,unsigned size);
其作用是在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。

用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向所分配域的起始位置的指针;如果分配不成功,返回NULL。如:

    p=calloc(50,4);
  开辟50×4个字节的临时分配域,把起始地址赋给指针变量p 
free函数

其函数原型为
void free(void *p);
其作用是释放指针变量p所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc或malloc函数时得到的函数返回值。

 free(p);
释放指针变量p所指向的已分配的动态空间 
free函数无返回值
 realloc函数

其函数原型为
void *realloc(void *p,unsigned int size);
如果已经通过malloc函数或calloc函数获得了动态空间,想改变其大小,可以用recalloc函数重新分配。

用realloc函数将p所指向的动态空间的大小改变为size。p的值不变。如果重分配不成功,返回NULL。如

   realloc(p,50);          
 将p所指向的已分配的动态空间改为50字节 
以上4个函数的声明在stdlib.h头文件中
在用到这些函数时应当用“#include <stdlib.h>”指令把stdlib.h头文件包含到程序文件中。

3 void指针类型

例题: 建立动态数组,输入5个学生的成绩,另外用一个函放数检查其中有无低于60分的,输出不合格的成绩。

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

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
void check(int *p);
void main()
{
    int *p,i;
    //(int *)将指针强制转换为int类型  sizeof(int)表示int类型数组一个字符的字节数
    /*建立(动态申请)一块内存空间,建立的内存空间为一个整型变量的长度,
    并把建立的空间地址转化成指向整型的指针赋值给前面的整型指针变量p*/
    p=(int *)malloc(5*sizeof(int));
    printf("请分别输入5个同学的成绩,以空格隔开:");
    for(i=0;i<5;i++)
    scanf("%d",p+i);//p的首地址未发生改变,若p++就改变了
    check(p);
}
void check(int *p)
{
 int i;
 printf("不及格的成绩为:");
 for(i=0;i<5;i++)
 if(p[i]<60) printf("%d   ",p[i]);
}



结果显示:
请分别输入5个同学的成绩,以空格隔开:59 68 97 34 56
不及格的成绩为:59   34   56

现在稍微更改题意,不输出不及格的成绩,输出不及格的人数

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
int check(int *p);
void main()
{
    int *p,i,n;
    printf("请输入人数:");
    scanf("%d",&n);
    p=(int *)malloc(n*sizeof(int));
    printf("请分别输入%d个同学的成绩,以空格隔开:",n);
    for(i=0;i<n;i++)
    scanf("%d",p+i);//p的首地址未发生改变,若p++就改变了
    printf("%d",check(p,n));
}
int check(int *p,int n)
{
   int i,k;
   printf("不及格的人数为:");
   for(i=0;i<n;i++)
   if(p[i]<60)  k++;
   return k;
}


结果显示:
请输入人数:5
请分别输入5个同学的成绩,以空格隔开:32 56 78 98 54
不及格的人数为:4

现在要求同时输出不及格的人数,和不及格的成绩

#include "stdio.h"
#include "stdlib.h"
int check(int *p,int n,int *p1);
void main()
{
 int *p,i;
 int *p1;
 p=(int *)malloc(5*sizeof(int));
 p1=(int *)malloc(5*sizeof(int)); 
 printf("请输入5名学生的成绩,用空格隔开:");
 for(i=0;i<5;i++)
 scanf("%d",p+i);
 
 printf("不合格的成绩为:");
 for(i=0;i<check(p,5,p1);i++)
 printf("%d ",p1[i]);
 printf("\n不及格总人数为:%d",check(p,5,p1));
    
}
int check(int *p,int n,int *p1){
 int i,b=0;
 for(i=0;i<n;i++)
  if(p[i]<60){
   p1[b]=p[i];
   b++;
  }
 return b;
 }


结果显示:
请输入5名学生的成绩,用空格隔开:34 56 78 98 59
不合格的成绩为:34 56 59
不及格总人数为:3
发布了195 篇原创文章 · 获赞 76 · 访问量 6988

猜你喜欢

转载自blog.csdn.net/qq_45696288/article/details/104950449
今日推荐