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));在编译的时候系统可以进行隐形的转换。

提一个名词:链表

相关文章