码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-03-12 15:03:54      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:空指针   文件中   数值   数组   强制类型转换   pre   class   void指针   i++   

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 = calloc(50,4);//开辟50X4个字节的临时分配区域,把起始地址赋给指针变量p

        (3).使用free函数

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

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

                 free(p)  //释放指针变零p所指向的已知的分配的动态空间

                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("\n");
20 }

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

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

标签:空指针   文件中   数值   数组   强制类型转换   pre   class   void指针   i++   

原文地址:http://www.cnblogs.com/xyzyj/p/6537797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!