一、了解堆区
#include<stdlib.h>
void main()
{
//空指针:
int* pc=NULL;
//空指针类型:
void* pa=NULL;
int* pi=NULL;
//运算
printf("%d %d",pi,pi+1);
//printf("%d %d\n",pa,pa+1);//不知道指针类型,报错
//堆区:由malloc/realloc申请的空间,由free来释放
//申请一个整形空间
int* p=(int*)malloc(sizeof(int))//申请4Byte空间,返回地址
//使用
*p=1900;
if(p!=NULL)//p不为空,说明malloc申请成功,p指向申请的空间。
printf("%d\n",p);
// 释放
if(NULL!=p)
{
free(p);
p=NULL;
}
float* p=(float*)malloc(sizeof(float));
if(p!=NULL)
*p=1.2345;
printf("%.4f\n",*p);
if(p!=NULL)
{
free(p);
p=NULL;
}
}
二、动态数组
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//数组的 容量,长度,下标
struct Array
{
int* data; //记录堆区地址
unsigned short len;//数组的长度
short index; //索引
};
void main()
{
//功能:1增加元素、2查找、3遍历
int opt;
//定义结构体变量:
struct Array a={NULL,0,-1};//定义变量:分配空间
int i;
while(1)
{
printf("please input[1/2/3/0]:");
scanf("%d",&opt);
switch(opt)
{
case 0:
{
if(a.len>0)
{
printf("本程序已关闭\n");
free(a.data);
a.data=NULL;
a.len=0;
a.index=0;
return ;
}
}
case 1://插入成绩:当容量不满足申请空间
{
int score;
printf("输入成绩:");
scanf("%d",&score);
//判断是否为满
if(a.index+1==a.len)//为满
{
int* pnew=(int*)malloc((a.len+5)*sizeof(int));
if(NULL!=pnew)
{
//老空间赋值给新空间
memcpy(pnew,a.data,a.len*sizeof(int));
a.len+=5;//长度为原来长度+5
free(a.data);//释放
a.data=pnew;//重新指向
}
else
printf("请求失败");
}
//插入数据
a.data[++a.index]=score;
}
break;
case 2:
{
int grade;
printf("请输入查找的成绩:");
scanf("%d",&grade);
for(i=0;i<a.len;i++)
if(a.data[i]==grade)
printf("%d\n",a.data[i]);
}break;
case 3:
{
printf("遍历\n");
for(i=0;i<a.len;i++)
if(a.data[i]!=NULL)
printf("%d\n",a.data[i]);
}break;
default:
printf("输入有误\n");
}
}
}