C|void、NULL及0的区别和联系

C|void、NULL及0的区别和联系一种通用指针, 可以通过类型转换强制转换为任何其它类型的指针;NULL:指针为空。0:指针为空或逻辑值为false;1void和void*voi

欢迎大家来到IT世界,在知识的湖畔探索吧!

一般地:

void:类型为空(未确定类型);

*void:一种通用指针(未确定类型的指针),可以通过类型转换强制转换为任何其它类型的指针;

NULL:指针为空;NULL表示内存位置0,NULL指针并不指向任何对象。因此除非是用于赋值或比较运算,出于其他任何目的使用NULL指针都是非法的。

0:指针为空或逻辑值为false;

1 void和void*

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

void不可以定义变量,因为定义变量前提是要开辟空间,而void是空类型。

void*可以定义变量,指针在32位平台占4个byte,但是void*定义的变量不可以解引用。

void用在函数定义当中可以表示函数没有返回值,或者没有形式参数。

void*表示指针指向的数据的类型是未知的。void*表示一个有效的指针,他确实指向一个实实在在的数据,可是数据的类型尚未确定,在后续的使用过程一般要强制类型转化。

malloc()的返回值为void*类型,原型定义如下:

void *malloc( size_t size );

欢迎大家来到IT世界,在知识的湖畔探索吧!

malloc()在使用的时候要强制类型转化为需要的类型,请看下例

欢迎大家来到IT世界,在知识的湖畔探索吧!#include<stdio.h>
#include<stdlib.h>
int main()
{
char *arr = (char *)malloc(sizeof(char)*20);
//开辟可以保存20个字符的内存大小,返回值转化为char*
gets(arr);
printf("%s\n", arr);
system("pause");
return 0;
}

众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值,不会出现问题;但如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值符号两边的类型转换为相同类型或兼容的类型,即就是把赋值运算符右边的指针类型转换为左边指针的类型。

例如:

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

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

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

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

void* p1;

int *p2;

p1 = p2;

但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。

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

欢迎大家来到IT世界,在知识的湖畔探索吧!void *p1;
int *p2;
p2 = p1;

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

add ( int a, int b )
{
 return a + b;
}
 int main()
{
 printf ( "2 + 3= %d", add ( 2, 3) );
}

程序运行的结果为输出:

2 + 3 = 5

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

2 NULL

NULL来表示一些无效的返回值,特别是返回无效指针。比如fopen函数,malloc函数等。

NULL是“零值”的意思,表示空指针,从表面上理解空指针是不指向任何数据的指针,是无效指针,程序使用不会产生任何效果。(注意区分大小写,null没任何含义)

一般C中都用宏定义

#define NULL 0
#define NULL ((void *) 0)

(void *)0表示把0强制转化为void*类型,最外层的()防止发生优先级等问题。所以,NULL不是不指向任何输入,而是指向了地址为0的内存。在大多数操作系统中,极小的地址通常不保存数据,也不允许程序访问,NULL可以指向这段地址区间的任何一个地址。

NULL和NUL的区别,NULL表示一个宏定义,空指针,可在代码中使用,NUL表示字符串结束标志’\0′,NUL没有在C语言中定义,所以不可以在代码中使用。

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

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

输出:(null)

对于字符串的结尾,使用’\0’,它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值。在不同的系统中,NULL并非总是和0等同,NULL仅仅代表空值,也就是指向一个不被使用的地址,在大多数系统中,都将0作为不被使用的地址,所以就有了类似这样的定义

#defineNULL 0

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

老式编译器当分配堆内内存失败时,会返回NULL指针,而较新的编译器都会引发异常。

3 C语言中的0

0是一个很特别的数,不仅是整数0,而且还有很多特别的意义,比如上面中就用0表示一个无效的地址。对地址为0的任何操作都是未定义的(undefined),就是说不能预料会有什么样的结果。C串结尾也是以整数0结尾,这个整数0是一个位全零的字节,该字节即使8位的整数同时也是ASCII码中的0。

-End-

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/50673.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信