上次我们初步了解了c++中的指针(关于指针(1)),这次,让我们看看指针的妙用。
指针实现链表
链表是一种复杂的数据结构,在C++中实现链表的方式多种多样,这里主要讲一种
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
struct node{
int data,num;//数据、序号
struct node * next;
}*head , *p , *q;
int main(){
head=p=nullptr;
q=new node;//动态内存
q->next=nullptr;
q->num=1;
int a=-1;
cout<<"第一个数字:"
cin>>a;
q->data=a;
head=q;
while(a){
p=q;
q=new node;
q->next=nullptr;
p->next=q;
q->num=p->num+1;
printf("第%d个数字:\n",q->num);
cin>>a;
q->data=a;
}
//输出:
q=head;
p=nullptr;
while(q->data){
printf("第%d个数字是:%d\n",q->num,q->data);
q=q->next;
}
//释放内存
q=head;
p=q;
while(q->next){
p=q->next;
delete []q;
q=p;
}
system("pause");
return 0;
}
结果:
<sys>第一个数字:
1
<sys>第2个数字:
2
<sys>第3个数字:
3
<sys>第4个数字:
4
<sys>第5个数字:
5
<sys>第6个数字:
0 //结束
<sys> 第1个数字是:1
第2个数字是:2
第3个数字是:3
第4个数字是:4
第5个数字是:5
<sys>按任意键继续...
大家应该都注意到了代码中的几句:
q=new node;
delete []q;
这就是我们接下来要讲的---动态内存。
动态内存:
- 意义:很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。
- 使用:在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。
如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。
我们可以这么理解,计算机内有许多空间,我们可以理解成一个大大的表格,每个格子都有自己的地址:
当执行一句变量声明的语句——如:
int a = 233;
——时,计算机会在内存空间中开辟一个位置:
当我们不能确定所需内存大小时,就可以使用new
new typename
这将返回一个还未被占用的(即堆中的)内存地址,也就意味着您需要一个typename*的指针类型来保存它。(注:这里的typename并非c++模板定义中的关键字,而泛指一切数据类型)
当自由储存区被用完,new将会返回一个NULL指针,为了防止在程序中出现难以预料的错误,您可以检查new运算符是否返回NULL。
double* pvalue = NULL; if( !(pvalue = new double )) { cout << "Error: out of memory." <<endl; exit(1); }
malloc()函数:malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。我们将很快会讲到该函数。(C++中的malloc()函数)
版权声明:本文为HaohaoCppDebuger原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。