博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态内存分配与指向它的指针变量
阅读量:5797 次
发布时间:2019-06-18

本文共 2274 字,大约阅读时间需要 7 分钟。

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
2 #include
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运算符测定在本系统中整数的字节数。

转载于:https://www.cnblogs.com/xyzyj/p/6537797.html

你可能感兴趣的文章
Valid Parentheses
查看>>
【ES6】数值的扩展
查看>>
性能测试之稳定性测试
查看>>
ES6的 Iterator 遍历器
查看>>
2019届高二(下)半期考试题(文科)
查看>>
【REDO】删除REDO LOG重做日志组后需要手工删除对应的日志文件(转)
查看>>
nginx 301跳转到带www域名方法rewrite(转)
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
network
查看>>
SettingsNotePad++
查看>>
centos7安装cacti-1.0
查看>>
3个概念,入门 Vue 组件开发
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
Angular2, NativeScript 和 React Native比较[翻译]
查看>>
论模式在领域驱动设计中的重要性
查看>>
京东AI研究院何晓冬:将先进的技术和模型落地到产业
查看>>