关于NULL.到底是什么?

du51 2005-03-28 12:40:34
#include<iostream>
using namespace std;
struct SingleNode
{
int i;
SingleNode *next;
};
struct DoubleNode
{
int i;
DoubleNode *pre;
DoubleNode *next;
};
SingleNode *createSingleLink()
{
SingleNode *SingleHead,*p,*q;
int i;
SingleHead=NULL;
cout<<"请输入数据以-1结束"<<endl;
cin>>i;
while(i!=-1)
{
p=new SingleNode;
p->i=i;
if(SingleHead==0)
{
SingleHead=p;q=p;
}
else
{
q->next=p;q=p;
}
cin>>i;
}
if(SingleHead)p->next=NULL;
cout<<"单链表已经形成!"<<endl;
return SingleHead;
}
void freeSingleLink(SingleNode *SingleHead)
{
SingleNode *p=SingleHead;
while(p)
{
SingleHead=p->next;
delete p;
p=SingleHead;
}
cout<<"单链表已经形销毁!"<<endl;
}
void displaySingleLink(SingleNode *SingleHead)
{
while(SingleHead)
{
cout<<SingleHead->i<<endl;
SingleHead=SingleHead->next;
}
}
DoubleNode *DLinkFromSingle(SingleNode *SingleHead)
{
SingleNode *q=SingleHead;
DoubleNode *DoubleHead,*p,*q1;
DoubleHead=NULL;
while(q)
{
p=new DoubleNode;
p->i=q->i;
if(DoubleHead==0)
{
DoubleHead=p;q1=p;q1->pre=NULL;
}
else
{
q1->next=p;p->pre=q1;
q1=p;
}
q=q->next;
}
p=NULL;
if(DoubleHead)q1->next=NULL;
cout<<"双链表已经形成!"<<endl;
return DoubleHead;
}
void freeDoubleLink(DoubleNode *DoubleHead)
{
DoubleNode *p=DoubleHead;
while(p)
{
DoubleHead=p->next;
delete p;
p=DoubleHead;
}
cout<<"双链表已经形销毁!"<<endl;
}
void displayDoubleLink(DoubleNode *DoubleHead)
{
DoubleNode *p=DoubleHead;
while(p) //此处...p或是p!=NULL都是一样.
{
cout<<p->i<<endl;
if(p->next==NULL)break; //此处.....若改为if(p->next)竟然第一次执行时就break?????
p=p->next;
}
while(p)
{
cout<<p->i<<endl;
if(p->pre==NULL)break; //此处.....若改为if(p->pre)竟然第一次执行时就break?????
p=p->pre;
}
}
int main(int argc,char *argv[])
{
SingleNode *sn=createSingleLink();
displaySingleLink(sn);
DoubleNode *dn=DLinkFromSingle(sn);
displayDoubleLink(dn);
freeSingleLink(sn);
freeDoubleLink(dn);
system("PAUSE");
return 0;
}

如上:
就是今天回一网友的贴子,我编了个试试.
也就是变单链表为双链表.
也就是说,NULL到底是什么?
是0?
还是指向为空?

像上面while的地方,最后跳出时那个p我已经设成了NULL(在createSingleLink或是createDoubleLink里).但是,这个设不设没有太大关系吧.
后面if里面的,肯定是指向为空.这个就不等0了吗?

对了,我这个在DEVC++里通过.我在VC++下面compile通过.LINK时死机!!!!!!!!一直显示"请输入数据以-1结束"为什么?是我VC++没装好,还是别的有问题了?
...全文
228 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
du51 2005-03-28
  • 打赏
  • 举报
回复
老大们帮帮忙呀.我刚才用VC编译另一个程序也挂了.......和上面一样.不会是我的VC............了吧......
zhousqy 2005-03-28
  • 打赏
  • 举报
回复
maybe 0
du51 2005-03-28
  • 打赏
  • 举报
回复
谢谢楼上各位了.
晨星 2005-03-28
  • 打赏
  • 举报
回复
不一定是啥,不同系统平台上的编译器可能有的不是0。
Bejarne Stroustrup建议直接使用0,因为C++标准中的空指针就是定义成0;如:
string *p = 0;
zjraycj 2005-03-28
  • 打赏
  • 举报
回复
NULL在有些头文件中是进行了类型强制转换的,不过可以当成0就行了,它会自动转换
zl0908 2005-03-28
  • 打赏
  • 举报
回复
我在看某些文档的时候,是这样定义的 #define NULL (void *) 0;
是一个地址为 0 的指针,如果访问 此地址,系统会认为是非法访问
c213x 2005-03-28
  • 打赏
  • 举报
回复
if(p->next==NULL)break; //此处.....若改为if(p->next)竟然第一次执行时就
-----------------------------------------------------------------------
很明显当p->next指向某地址时: if ( p->next == NULL )相当于 if ( 0 )
if ( p->next ) 相当于 if (1)
所以改后当然第一次就break阿
FlyWithJo 2005-03-28
  • 打赏
  • 举报
回复

大多数编译器定义的NULL都是等于0的,不知道什么编译器定义的NULL值为-1,请eric_shenzhen(衣带渐宽终不悔,为伊消的人憔悴) 介绍一下。

to Mephisto_76((望美人如梦))
另外,在C++的教材里很多地方用的都是NULL,为什么不考虑用NULL,直接使用0的
Mephisto_76 2005-03-28
  • 打赏
  • 举报
回复
在C++应该不考虑使用NULL,直接使用0。
Mark-阿桂 2005-03-28
  • 打赏
  • 举报
回复
NULL 不同编译器定义有些不同,有些是-1,有些是0,因此判断的时候最好用 !=NULL or ==NULL来判断,这样不会出现问题,至少不同编译器对这种编译出来的是一样的,不会因为-1,0 的问题导致程序出错!

一家之言
dongpy 2005-03-28
  • 打赏
  • 举报
回复
VC下把它当作0就行,好多头文件都这么定义:#define NULL 0
whoho 2005-03-28
  • 打赏
  • 举报
回复
不同的编译器定义的不完全一样,甚至我还见过不定义NULL的编译器
因为,NULL的定义并不在语言的标准中规定

大多数情况下可以认为是0,有些库还把它定义为空函数指针
UniverseWisdom 2005-03-28
  • 打赏
  • 举报
回复
VC++中应该是用这句定义NULL的
#define NULL 0
kobefly 2005-03-28
  • 打赏
  • 举报
回复
就是0啊
yuchengliu 2005-03-28
  • 打赏
  • 举报
回复
空值
就是NULL == 0
naturemickey 2005-03-28
  • 打赏
  • 举报
回复
NULL 是整数 0 。
pcboyxhy 2005-03-28
  • 打赏
  • 举报
回复
多数情况下可以当0看
xxxdg 2005-03-28
  • 打赏
  • 举报
回复
NULL == 0

if(p->next) <==> if(p->next!=0) <==> if(p->next!=NULL)

So...
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧