c语言NULL是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言NULL是啥意思?相关的知识,希望对你有一定的参考价值。

rt

朴素的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,这就定义它。

参考技术A null,本意是"空的;元素只有零的"意思。计算机中通常表示空值,无结果,或是空集合。
null指针是一个无类型指针,并且值为0。一个指针,拥有2个属性--地址值和指针类型。两者的作用是:1,地址值标识变量的首地址(32位系统下指针的地址值占4字节);2,指针类型告诉编译器,应该怎样进行接下来的数据访问(int型数组和float型数组是不同的;数组访问与结构体访问也是不同的;等等)。
参考技术B NULL 一般是对指针初始化赋值为空,表示变量什么值也没有,防止指针成为野指针

NULL就是没有值
参考技术C

大多数情况下为0

可以从头文件中看到其宏定义

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#define offsetof(s,m) (size_t)&(((s *)0)->m)

参考技术D

C语言中num/=10是啥意思

那么k*=num%10 又是什么意思啊?

在C语言中/=是复合赋值运算符的一种,是两种运算(除、赋值)的结合,x/=10等同于x=x/10。

先进行左侧表达式除以右侧表达式的除法运算。然后进行把结果赋值给左侧表达式的赋值运算。这种运算符主要是为了简化表达式写法,当某个表达式要进行除法操作并且把除法结果赋值给自己的时候,可以用这种写法。

类似的其他运算符还有:

+=、 -=、 *=、 %=、 &=、 |=、 ^=、 <<=、 >>=其中等号左边的运算符分别是:加、减、乘、取余、按位与、按位或、按位异或、左移、右移。

扩展资料:

运算符号,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补 0)位移。例如,将 11100011 右移 3 比特,算术右移后成为 11111100,逻辑右移则为 00011100。因算术比特右移较适于处理带整数,所以几乎所有的编译器都是算术比特右移。

运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。

C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。

参考资料来源:百度百科-C语言

参考技术A 这个算是 c语言特有的运算命令吧 ,因为其书写方式的特殊。
x/=10 首先,x是变量,10是已赋值的变量或者常量;其次,x/=10 等价于 x=x/10 就是先把x原本的值和10的值进行除法运算后 ,在赋值给x。
比如有程序代码 : int x=10;
x/=10 ;
printf(“x=%d“,x);
经过上面的代码后,x的值就变成x=x/10 等于1了。
和这类型相似的形式还有很多比如+=,-=,*=,希望对你有帮助。
参考技术B

在C语言中 num /= 10 是一种简便的写法,其等价于 num = num / 10;

在C语言中这是一种普遍的写法,类似的有 num += 10 等价于 num = num + 10;可参见如下的程序:

#include<stdio.h>
#include<stdlib.h>

int main ()

    int num = 20;
    num /= 10;
    printf("num = %d\\n",num);
    //还原num的值
    num = 20;
    num = num / 10;
    printf("num = %d\\n",num);

    printf("\\n");

    //还原num的值
    num = 20;
    num += 10;
    printf("num = %d\\n",num);
    //还原num的值
    num = 20;
    num = num + 10;
    printf("num = %d\\n",num);

    return 0;

运行结果:
num = 2
num = 2

num = 30
num = 30

可以看到两次的运算结果是相同的。

参考技术C 就是num=num/10; 就是将num除以10,将得到的结果重新赋值给num。
表达式1/=表达式2 等价于 表达式1=表达式1/(表达式2)。.追问

那么k*=num%10 又是什么意思啊?

参考技术D 这个要看你有的c语言标准了
貌似有些标准是表示a=a+10
有些标准认为这个是错误的

现在大多数编译器应该是不允许这样的算式的,原因如下
假如出现一个类似的表达式
a=-10
那这个到底是表示a=a-10还是表示将-10赋值给变量a呢,因而存在二义性
正确的写法应该是
a-=10

以上是关于c语言NULL是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

c语言NULL是啥意思?

c语言中num[k++]=i是啥意思

C语言中num/=10是啥意思

c语言中malloc是啥?怎么用?

c语言。 if(num&0x01),这个if语句里面判断的是啥?

system在C语言里是啥意思