说到编程,不得不提变量
问题来了
问题1:什么是变量?
大白话就是:国家划了一块地,盖了间房子,这间房子的盖的大小,就指存储空间,这个房子就是变量,可以在房子里放东西,东西就是数据
专业语言就是:
变量,就是指系统在内存中分配的一块存储空间,可以用来存数据
那好说了,定义变量,就是通知系统在内存中分配一块存储空间
问题2:变量分配存储空间都有什么方式?
按照分配完成的时机分为两种:静态分配和动态分配
讲讲静态分配
静态分配指,在编程过程中按普通形式定义的变量,如 int a,
该句表示给a开辟一块存储空间,存储空间的大小为int型,这个空间算是定下了,不能进行改变
静态分配的缺点
因此 提出了一个问题,既然不能改变,那就说明不够弹性,万一数据大小超过了存储空间大小,或者数据远远小于存储空间大小呢?如果我定义一个 数组 a[100] 结果只用了20个呢?
因此,静态分配实在不够方便,太浪费空间了,而且程序在编写之初,编写者并不能确定分配多少才能不浪费。
因此动态分配来了
讲讲动态分配
动态分配,就是为了根据实际需要来确定分配的存储空间,在程序运行时进行分配。
C语言使用的函数是malloc() 和 free() 来动态分配内存空间和释放内存空间的,通常配合指针来使用
C++提供了更加简便、功能更强的运算符,new(),delete()
C:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main() {
int* a;
int* b;
if((a=(int *)malloc(10*sizeof(int))) == NULL)
cout << "内存分配失败";
*(a+1)=10;
cout<<*(a+1)<<endl;
free(a);
a[1]=20;
cout<<a[1]<<endl;
if ((b = (int*)malloc(10 * sizeof(int))) == NULL)
cout << "内存分配失败";
cout << *(a + 1) << endl << a[1] << endl;
return 0;
}
可以理解为,malloc只有一套房子,把a存进去了,无论是否free(a)
(是否解出与malloc分配的存储空间的占用关系)a的值仍然可以访问,但当malloc把内存分配给其他变量,那么a就无法访问了
C++保存了malloc和free,但又提供了new和delete
这两个既可以当做运算符使用,也可以当做函数使用
new用于动态分配内存空间,并返回成功分配存储空间的首地址,若分配失败返回null
把new当做运算符使用
指针变量名 = new 数据类型[数据个数]
把new当做函数使用
指针变量名 = new(数据类型[数据个数])
执行new后,系统会从内存中一个叫"堆"的自由存储区中分配一块 连续的、大小等于单个数据类型所占字节数X数据个数的存储空间,并返回该内存的首地址
delete用于释放new分配的存储空间,应一起使用
分配:
int *p;
当做运算符: p = new int[10];
当做函数: p = new(int[10]);
释放
若为变量
delete 指针变量名
delete p;
若为数组
delete []指针变量名
delete []p;
分配好之后按照数组的形式去访问 *(p+i)
讲讲malloc和new的区别
虽然二者功能相同
但是new和delete有优于malloc 和free的地方
-
malloc 需要人工分配存储空间,这就可能出现计算错误的情况
而new是自动计算分配储存空间
-
malloc 需要编程者把返回的分配好储存空间的首地址进行强制转换
而new通过赋值运算符自动转换分配好存储空间的首地址
-
new还可以为简单变量分配内存的同时进行初始化
p = new int(99) //动态分配内存空间,并初始化值为99 也可以分配一片连续的空间给数组 int *p = new int[10] //一维 int *p = new int[5][5] //二维 int *p = new int[3]{1,2,3}; //即p[0]=1,p[1]=2,p[2]=3,即地址为p、p+1、p+2
delete的时候不需要考虑维度,统一写成 delete[]指针变量名