void ,NULL与0的区别联系

void ,NULL及0的区别联系

void的详解:

void的字面意思是“无类型”或“空类型”,void*则为“无针型指针”,那就意味着void*可以指向任何类型的数据。

众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值,不会出现问题;但如果p1和p2指向不同的数据类

型,则必须使用强制类型转换

运算符把赋值符号两边的类型转换为相同类型或兼容的类型,即就是把赋值运算符右边的指针类型转换为左边指针的类型。

例如:

float *p1;
int *p2;
p1 = p2;

其中p1= p2语句会编译出现警告

In function ‘main’:

15:7: warning:assignment from incompatible pointer type [enabled by default]

提示我们第十五行的赋值类型不兼容

而改成p1= (float *)p2;才正确;

而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:

void*p1;
int *p2;
p1 = p2;

但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简

单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。

下面的语句编译出错或警告:

void *p1;
int *p2;
p2 = p1;

在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多人却误以为其为void类型。例如:

add ( int a, int b )
{
return a + b;
}
int main(int argc,char* argv[])
{
printf ( "2 + 3= %d", add ( 2, 3) );
}

程序运行的结果为输出:

2 + 3 = 5

这说明不加返回值说明的函数的确为int函数。

NULL详解:

运行:

#include<stdo.h>
int main()
{
int *p=NULL;
printf("%s",p);
}

输出:(null)

gdb调试可以看出执行int*p=NULL,p的值为0x00000000,可以看出,NULL在实际底层调用中就是0。

而NULL在C语言的stdio.h头文件里面的定义为:

#if!defined(NULL) && defined(__NEEDS_NULL)
#ifdef__cplusplus
#defineNULL 0
#else
#defineNULL ((void *)0)
#endif
#endif

由此可见,在C语言中,NULL和0的值可以说是一样的,但是为了不同目的和用途及容易识别的原因,NULL用于指针和对象中,0用

于数值

对于字符串的结尾,使用‘\0‘,它的值也是0但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值。在不同的系统

中,NULL并非总是和0等

同,NULL仅仅代表空值,也就是指向一个不被使用的地址,在大多数系统中,都将0作为不被使用的地址,所以就有了类似这样的

定义

#defineNULL 0

但并非总是如此,也有些系统不将0地址作为NULL,而是用其他的地址。

版权声明:本文为博主原创文章,可以不经博主允许转载,但必须注明出处,我将保留追究责任的权利。

时间: 2024-10-08 09:58:32

void ,NULL与0的区别联系的相关文章

【转载】C/C++杂记:NULL与0的区别、nullptr的来历

原文:C/C++杂记:NULL与0的区别.nullptr的来历 某些时候,我们需要将指针赋值为空指针,以防止野指针. 有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. 也有人直接使用0值作为空指针常量,例如:int* p = 0;. 前者可能觉得:NULL作为空指针常量,名字很形象,可读性较强. 后者可能觉得:NULL并不是C/C++语言的关键字,而是一个在标准库头文件<stddef.h>中定义的宏,因此要使用NULL,可能需要直接或简介地包含<stddef.

C/C++杂记:NULL与0的区别、nullptr的来历

某些时候,我们需要将指针赋值为空指针,以防止野指针. 有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. 也有人直接使用0值作为空指针常量,例如:int* p = 0;. 前者可能觉得:NULL作为空指针常量,名字很形象,可读性较强. 后者可能觉得:NULL并不是C/C++语言的关键字,而是一个在标准库头文件<stddef.h>中定义的宏,因此要使用NULL,可能需要直接或简介地包含<stddef.h>头文件,比较麻烦. 问题一:NULL与常数0值有何区别

C/C++语言中NULL、&#39;\0’和0的区别

注:本文参考了http://blog.csdn.net/mylinx/article/details/6873253及书籍<征服C指针>([日]前桥和弥著). NULL.'\0'和0的值是一样的,都是0,不过它们的表现形式不一样: 1. NULL: 即空指针,不过在C和C++中并不一样.在VS 2013的库文件string.h中可以看到如果定义. 1 /* Define NULL pointer value */ 2 #ifndef NULL 3 #ifdef __cplusplus 4 #d

a href=#与 a href=javascript:void(0) 的区别

转载:http://blog.csdn.net/fightplane/article/details/5190037 a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP <a href="JavaScript:void(0)" onClick="window.open()"> 点击链接后,页面不动,只打开链接 <a href="#" onclick="javasc

c语言NULL和0区别及NULL详解

先看下面一段代码输出什么: #include<stdo.h> int main() { int *p=NULL; printf("%s",p); } 输出<null> ,单步调试可以看出执行int *p=NULL,p的值为0x00000000,可以看出,NULL在实际底层调用中就是0, 在C语言中, NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值 对于字符串的结尾,使用'\0',它的值也是0,但是让人一看就知道

NULL, &#39;\0&#39;,0 &#39;0&#39;的区别

1.NULL; NULL 即空指针,在C和C++中的形式不一样,msdn上有如下的内容那个: #if !defined(NULL)&&defined(__NEEDS_NULL) #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif NULL 在c中用(void*)0表示,在c++中用0表示. 2.'\0' '\0'表示字符串结束,它在ASCII中的值为0(数值0,非字符‘0’) 所以在数

NULL、0、nullptr 区别分析

C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL; foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #define NULL ((void *)0) 也就是说NULL实际上是一个void *的指针,然后吧void *指针赋值给int *和foo_t *的指针的时候,隐式转换成相应的类型.而如果换做一个C++编译器来编译的话是要出错的,因为C++是强类型的,void *是不能隐式转换成其他指针类型的,所以通

C/C++ 中 NULL、&#39;\0&#39;、&#39;0&#39; 、0、及空格的区别

1.NULL即空指针.在C中,NULL是指向0的指针,由 #define NULL ((void *)0)定义:在C++中,NULL就是0,由 #define NULL 0 定义.可参见 vs2013 的库文件 string.h. 2.'\0' 是空字符常量,表示字符串的结束,ASCII码值为0. 3.'0'是字符0,ASCII码值为48. 4.0是数字0. 5.空格是可显示字符空格,ASCII 码值为32. 备注: 给指针置位为空指针时,应该使用 NULL: 给字符串添加结束标志时,应该使用

href=&quot;#&quot;和javasrcript:void(0)的区别

当我们需要一个空链接时,通常有两种方法: <a href="#">这个一个空链接</a> 和 <a href="javascript:void(0)">这是另一个空链接</a> href="#" #之后跟着锚记名称,点击后跳转到页面指定位置:没有跟锚记名称则默认跳转到页面顶部 href="javascript:void(0)" void是一个操作符,这个操作符指定要计算一个表达式