指针初始化时设置为0和NULL的区别?求高手解答~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针初始化时设置为0和NULL的区别?求高手解答~相关的知识,希望对你有一定的参考价值。

为什么要把指针设为NULL而不是0?为什么要把指针设为0不设为NULL?也就是说什么时候应该把指针设为0,什么时候把指针设为NULL?编写程序时,把指针设为有什么作用(意思)?
有个高手给了我一个答案,我觉得很不错,就分享出来和大家共享下~
是一个叫poseidon_k的朋友帮助我的,下面共享他的解释:
0是一个数字,本身有着一些原生的特性诸如:起始,没有,正负的分界线,0/1中的0还可以表示否定。

NULL用于将指针指定为空指针,也就是说该指针不指向任何对象,不可以对该指针进行解引用,否则系统会报错。

很巧合并且可能令人迷惑的是,在Windows环境下,NULL正好被定义为0,对于Windows程序,将指针初始化为0或NULL的作用是相同的,都使指针无效。这是因为Windows的内存管理将0x00000000地址设为无效内存,不允许代码对它进行读写。仅仅微软的一个定义,令不少人误以为NULL和0有着天生的紧密关系,这显然是一个历史的误区。

既然设计NULL是为了满足将指针规定为无效的逻辑上的功能,那么假如某个系统指定无效内存地址为0x20000000,那么基于这个系统的编译器就很有可能将NULL定义为0x20000000,这时0和NULL就不能等同了。

千万记住,0以及其他所有数字在编程中仅仅是一个常量,并不一定具有某一逻辑上的功能。

呃,你可以这样理解,NULL 是关键字,如果将指针的值设置为null,即代表当前指针为空指针,其不指向内存中的任意地址,而当指针设置为0时,其实质是在内存中申请一片空间,将0放入,然后将0的内存地址赋给指针,指针使用前都要初始化,而许多程序员在申明指针或者初始化时都喜欢赋值null,这是良好的编程习惯,因为如果你不给指针初始化,指针会随机的指向内存中的任何一个地址,这就是俗称的“指针指飘了”,在现在的计算机系统中是没什么的,但是早期的计算机系统中轻则内存泄漏,重则系统崩溃(现在的操作系统一般都会由系统或者编译器报错的),如果还不明白,请继续追问,谢谢 参考技术A

在编译器中  NULL被宏定义为指向一个0的地址

也就是说  初始化为NULL 表示 指向一个地址  只不过这个地址是空的 

参考技术B #define NULL 0
NULL即0
参考技术C 主要看你心情爽不爽而决定用哪个
NULL就是0,0就是NULL
叫你的学名也是叫,叫你的小名也是叫
两个为一区别就是NULL 比较专业一点,大多数编程语言都定义NULL为空的意思。
如果你写一个int * p = 0 你告诉我你定义的是NULL 谁知道了啊

C语言,宏定义和结构体指针问题,求高手解答啊,谢谢了!!

#define dps struct S*
typedef struct S* tps;
在上面的基础上求出下面两个表达式的等价表达式:
(1)dps p1,p2;
(2)tps p3,p4;

宏定义完全就是字符串替换,所以:
(1)等价于 struct S *p1, p2;
这里p1是个指针,而p2是个普通变量
(2)等价于 struct S *p3, *p4;
p3和p4都是指针。追问

第一组为什么p1是指针,而p2是普通变量
而第二组p3、p4都是指针啊,能详细解释下吗?
先谢谢了!!

追答

因为#define完全就是简单的字符串替换。
dps p1,p2;
因为dps是个宏,宏就是字符串替换,你把dps替换成struct S*,就变成了:
struct S* p1, p2;所以p1是指针,p2是对象。

而typedef是定义了一种新类型,不是字符串替换。

追问

额,谢谢,大概意思懂了,不过第二句的typedef struct S* tps;
这句里面的S* tps是作为一个整体,来当做结构体名吗?那么tps又代表什么?第二句看不太懂?
能详细介绍下吗??谢谢啦!!

追答

关于typedef,在谭浩强那本C语言里就有详细讲怎么做类型替换的。

简单理解, struct S*是作为一个整体,tps是一种新的类型。
第二种形式,也不必研究得太细。这种形式以后见多了就习惯了。

追问

也就是说第二种形式中typedef struct S* tps中struct S*相当于S型结构体指针的修饰符,后面加上tps来定义一个S型结构体指针,是这个意思吗?

追答

你说的这个意思,我也糊涂了,我也从来没想过这个问题。
这个问题,不用想这么清楚吧。
就像:
typedef int INT;就相当于给int起了另一个名字INT
然后你用INT a,就完全等价于int a;

typedef int * P_INT; 那么用P_INT a的时候,就等价于int *a。
这个别想那么复杂,见得多了,就习惯了。

另外,真正的项目里,是不会用define 定义新类型的。所以实际上这个问题也不用搞那么清楚。

追问

呵呵,谢谢!!有些问题确实深究一下就会越弄越糊涂,不深究的话心里又不舒服!哎!

参考技术A typedef struct S* tps;
这句话定义了用 tps 代表 struct S* 这个指针类型,就像 typedef int NUM;
以后NUM就代表 int,比如 NUM a,b; 相当于 int a,b; a,b,就是 NUM那个类型的变量;
所以p3,p4 为 struct S* 类型的指针变量;而宏定义是#define dps struct S* 是在你写完代码编译时编译器自动将代码中的dps 替换为你定义的 struct S*这几个字符,所以当你执行时dps p1,p2;这句话就相当与 struct S*p1,p2; p1为指针类型,p2 为结构体变量。相当于int *p1,p2;
p1为指针p2为整形变量
希望可以帮到你

以上是关于指针初始化时设置为0和NULL的区别?求高手解答~的主要内容,如果未能解决你的问题,请参考以下文章

课程设计数字秒表设计 求高手解答。

一个简单的Qt构造函数的参数初始化问题,求高手解答

200分求高手解答iframe和embed的区别

求高手解答下关于“危机公关”的疑惑

赋值为0或null,和不赋值的区别

请批处理高手进来解答