C语言怎么赋空值

Python013

C语言怎么赋空值,第1张

C语言并没有空值这个概念,一般习惯上,指针若是指向地址0便是空值,其他数据若内容是0便是空值。填充一大片内存区域可以使用memset函数,它的填充长度是按字节计。

整形:int a = 0

字符型:char a = 0

数组:

int a[20]

memset( a, 0, sizeof(int)*20 )

C字符串只需要把第一个字符设为'\0'即可。

当然也可以全部清成0。

char a[20] = "ashdfuih"

memset( a, 0, sizeof(char)*20 )

例如有一个结构体Some x,可以这样清零:

memset( &x, 0, sizeof(Some) )

如果是一个结构体的数组Some x[10],可以这样:

menset( x, 0, sizeof(Some)*10 )

任何一个指针都可以通过直接赋为0变成空指针:

Some* p = 0

NULL 就是一个特殊的指针值, 其实本质是一个宏

#define NULL (void *)0

也就是0值, 强制转成了指针。

用来表示一个指针非法。 所以在初始化的时候经常用NULL来初始化。

由于是非法指针, 所以对这个指针取值(*操作)会导致程序崩溃。 必须要先指向一个有效空间才可以。

朴素的0值或者无类型的0值(void 0)

计算机语言中为了确定数据宽度(占用字节数)以及数据编码,一般都是有类型定义的,比如C语言中bool为8位逻辑值(单字节),int 为16位整数(双字节),long 为32位整数(4字节),float是32位浮点数(4字节),double为64位浮点数(8字节),等等。

因此,数据类型定义了数据宽度和数据编码,因此严格意义上说,一个16位整数的0与一个32位整数的0,以及浮点数的0都是不同的,原因是数据宽度不同,特别是浮点数的0不是绝对的0值,它可能是一个0.0000000000000001很小的数,但是有时候我们需要一个明确的通用的或者一般意义的0值来表示无效值,比如为了表示指针未被赋预有效地址,我们设置一个0值,为了防止代码有歧义,也为了可读性(一看就知道表示未定义指针),所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。

由于没有定义数据类型,因此也就不具有具体数据宽度和编码,当NULL赋值给16位变量时就是16位全0,当赋值给32位变量时,其值就是32个全0,也不会出现像浮点数那样产生精度误差。这就是虚类型的意义,任何编译器都认可这种约定,这样代码移植的时候不会因为软硬件环境改变而出现问题(CPU、编译器改变)。

你可以在任何编译器中,点击NULL右键查看定义。

这里稍微解释一下,上图高亮部分是表示C++,也就是如果当前语言是C++,则直接定义NULL为 0值,如果是其他(可能是C),则明确定义为 void 0,因为C++编译器会自动转换。#ifndef 宏命令表示:如果当前环境中其他模块还未定义NULL,这就定义它。