zoukankan      html  css  js  c++  java
  • 动态内存分配与指向它的指针变量

    1.动态内存分配的含义

      c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。

    2.建立内存的动态分配

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

    (1).使用malloc函数

      其函数原型为void *malloc(unsigned int size);

      其作用是在内存的动态存储区域中分配一个长度为size的连续空间,形参size的类型定义为无符号整形(不允许为负数)。次函数的值(即返回值)是所分配区域的第一个字节的地址,或者说,次函数是一个指针型函数,返回的指针指向该分配区域的开头位置,如:

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

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

    (2).使用calloc函数

      其函数原型为void *calloc(unsigned n, unsigned size);

      其作用是在内存的动态区域中分配长度为size的连续空间,这个空间一般比较大,足以保存一个数组。

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

    p = calloc504);//开辟50X4个字节的临时分配区域,把起始地址赋给指针变量p

    (3).使用free函数

      其原型为void free(void *p);

      其作用是释放指针变量p所指的动态空间,使这部分空间能重新被其他变量使用,p应该是最近一次调用calloc或malloc函数得到的函数返回值,如;

    1 free(p)  //释放指针变零p所指向的已知的分配的动态空间
    2 
    3 free函数物返回值

    (4).使用realloc函数

      其原型为void *realloc(void *p, unsigned int size);

       如果已经通过malloc函数或calloc函数获得了动态空间,向改变其大小,可以用realloc函数重新分配。

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

      realloc(p,50) //将所指的已分配的动态空间该为50个字节

           以上4个函数的声明在stdlib.h头文件中,在用到这些函数的时候应用#“include<stdlib.h>”指令把stdlib.h头文件包含到程序文件中

    3.void指针类型

      C99允许使用基类型为void的指针类型。可以定义一个基类型为void的指针变量(即void*型变量),它不指向任何类型的数据。把void指针赋给不同基类型的指针变量(或相反)时,编译系统会自动的进行转换,不必用户自己进行强制类型转换,如 void *p1; int a = 3;p1 = &a.相当于p1 = (void*)&a;

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

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

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main()
     4 {
     5     void check(int *);
     6     int *p1;
     7     //开辟动态内存区,将地址转换为int *型,然后放在p1中
     8     p1 = (int *)malloc(5* sizeof(int));   //p1 = malloc(5*sizeof(int));也可以
     9     for (int i = 0; i < 5; i++)
    10         scanf_s("%d",p1+i);//输入5个学生的成绩
    11     check(p1);
    12     return 0;
    13 }
    14 void check(int *p)
    15 {
    16     int i;
    17     for (int i = 0; i < 5;i++)
    18     if (p[i] < 60) printf("%d ",p[i]);
    19     printf("
    ");
    20 }

      程序分析:程序中没有定义数组,而是开辟了一段自由动态分配区,作为动态数组使用,在调用malloc函数时,没有给出具体的值,而是用5*sizeof(int),因为有5个学生的成绩,每个成绩是一个整数,但在不同系统中存放一个整数的字节不同,为了程序具有通用性,故用sizeof运算符测定在本系统中整数的字节数。

  • 相关阅读:
    关于宇宙大爆炸的理论模型
    算法系列2《RSA》
    Codeforces Round #248 (Div. 1)——Nanami&#39;s Digital Board
    Cocos2d-x场景变化相关功能介绍
    NYOJ 745 蚂蚁问题(两)
    quick-cocos2d-x endToLua 退出会卡住
    编程算法
    linux基础知识1
    URAL 1553. Caves and Tunnels 树链拆分
    2014/11/13_ 随想
  • 原文地址:https://www.cnblogs.com/xyzyj/p/6537797.html
Copyright © 2011-2022 走看看