C语言指针(八)
动态内存分配与与指向它的指针变量
- 内存的动态分配
- 建立动态内存
- malloc函数开辟动态存储区
- calloc函数开辟动态储存区
- realloc函数重新分配动态存储区
- free函数释放动态储存区
- void指针类型
- 例子
内存的动态分配
全局变量分配在静态储存区,非静态的局部变量分配在内存中的动态储存区(栈)。C语言建立内存动态分配区域,是一个特别的自由存储区,称为堆区,存放一些临时的数据,这些数据不必声明不必释放,而是随时开辟,随时释放。也可以根据需要,像系统申请所需大小的空间。
建立动态内存
- 四个函数malloc,calloc,free,realloc。包含在头文件stdlib中。#include<stdlib.h>
malloc函数开辟动态存储区
void *malloc(unsigned int size)
malloc(100)//指针变量malloc指向首地址
在内存的动态存储区分配一个长度为size的连续空间。是一个返回指针变量的函数,返回的指针指向该分配域的第一个字节。比如malloc(100)。指针基类型为空类型(void型的指针类型),只提供一个纯地址,如果函数没有成功执行,返回NULL
calloc函数开辟动态储存区
void *calloc(unsigned n,unsigned size)
p=calloc(50,4)//首地址赋给p
开辟n个长度为size的连续空间,calloc可以为一维数组开辟动态储存空间,n为数组元素个数,每个元素长度为size。这就是动态数组,
realloc函数重新分配动态存储区
void *realloc(void *p,unsigned int size)//p为已经获得空间的指针
可以改变由malloc和calloc函数获得的动态空间大小,用realloc重新分配
realloc(p,50)
free函数释放动态储存区
void free(void* p)
释放指针变量p所指向的动态空间,使这部分能重新被其他变量使用。
free(p)//释放指针变量p所指向的已分配的动态空间
void指针类型
void型指针变量指向不确定类型,在他的值赋给另一个指针变量的时候由系统对他进行类型变化。如下
void *p;
int *p1;
p1=(int *)p;//类型转换
指向空类型的指针变量可以存放任何类型的数据,只是在储存的时候进行一个类型转换
int* pt;
pt=(int*)malloc(100)//开辟100个字节的内存空间,void型指针变量malloc指向首地址,然后通过转换,让整型指针变量pt指向这个地址,然后pt所指的储存单元就可以存放整形了
例子
- 建立动态数组,输入5个学生的成绩,另外一个函数检查其中有无低于60分的,输出不合格的成绩
#include<stdio.h>
#include<stdlio.h>
int main(int argc, char* argv[])
{
void check(int* p);
int* p1,i;
//p1=malloc(5 * sizeof(int));
p1=(int*)malloc(5 * sizeof(int));
printf("please input 5 nums:");
for (i = 0; i < 5; i++)
{
scanf_s("%d\n", p1 + i);
}
check(p1);
return 0;
}
void check(int* p)
{
int j;
for (j = 0; j < 5; j++)
{
if (*(p + j) < 60)
printf("%d", *(p + j));
}
printf("\n");
}
sizeof的作用是测定本系统整数的字节数
p1=malloc(5 * sizeof(int));在编译的时候系统可以进行隐形的转换。
提一个名词:链表