C语言修行之基础篇 (二十二) C语言中的NULL


NULL在C/C++中的标准定义

1、NULL不是关键字,本质上是个宏定义
2、NULL标准定义:

#ifdef _cplusplus            // 判断当前编译环境是C还是C++
#define NULL 0                 // C++环境下,编译器预先定义一个宏_cplusplus      
#else
#define NULL (void *)0         // C语言环境
#endif

NULL 的本质解析: NULL的本质就是0,但是这个0不是按一个数字解析,而是当一个内存地址解析的,这个0其实是0x00000000,代表是内存的0地址。
(void *)0这个整体表示式表示一个指针,这个指针变量占4字节,地址在哪里取决于变量本身,但是这个指针变量的值是0,也就是这个指针变量指向0地址。


从指针角度解析NULL本质

1、int * p;
解析:p是一个函数内的局部变量,则p的值是随机的,这时候的p就是一个野指针。

2、int *p = NULL;
解析:p是一个局部变量,分配在栈上的地址是由编译器决定的。p的值是(void *)0.实际上就是0,意思是指针指向内存地址0处,这时候p就不是野指针。


为什么要让一个野指针指向内存0地址处?

因为在大部分CPU中,内存0地址处都是不可以随便访问的。所以野指针指向了这个区域可以保证野指针不会造成误伤。


为什么需要NULL?

1、让野指针指向0地址安全
2、作为一个特殊标志。按照标准的指针使用步骤:

int *p = NULL;            // 定义p时立即初始化为NULL
P = XX;
if (NULL != p)
{
    *p                    // 在确认p不等于NULL的情况下才去解引用它
} 
p = NULL;                  // 用完之后p再次等于NULL

NULL 和 ‘\0’ 和 ‘0’ 和 0 区别

NULL 和 ‘\0’ 和 ‘0’ 和 0 区别
含义ASCII编码值本质用法
‘\0’转义字符00C语言字符串的结尾标志,一般用来比较字符串中的字符判断字符串有没有结束。
‘0’字符4848一般用来获取0的ASCII码值
0数字--0一般用来比较一个int类型的数字是否等于0
NULL表达式--强制类型装换为void *类型的0一般用来比较指针是否是一个野指针
  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C语言的条件运算符是三元运算符,其基本形式为:expr1?expr2:expr3。它需要三个表达式,如果expr1的值为非0,则整个条件表达式的值为expr2;如果expr1的值为0,则整个条件表达式的值为expr3。 通过使用条件运算符,可以根据条件的结果选择性地执行不同的代码块,实现简单的条件判断和赋值操作。在C语言,条件运算符经常用于简洁地编写条件语句或表达式,如求两个数的最大值、根据条件给变量赋值等。 例如,可以使用条件运算符来根据用户输入的等级选择不同的付款金额,如下所示: ```c #include <stdio.h> int main(int argc, char* argv[]) { int nLevel = 0; scanf("%d", &nLevel); int nPayment = 0; nPayment = (nLevel > 100) ? 1000 : 0; printf("Payment:%d\r\n", nPayment); return 0; } ``` 在上面的示例,根据输入的等级nLevel,使用条件运算符判断如果nLevel大于100,nPayment变量的值为1000,否则为0。最后输出nPayment的值作为付款金额。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言基础入门48_15_条件运算符(expr1?expr2:expr3,三元运算符,||等为二元运算符、expr1非0,值为expr...](https://blog.csdn.net/Dasis/article/details/122925122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [C语言条件运算符](https://blog.csdn.net/weixin_30307921/article/details/98728938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bazinga bingo

您的鼓励就是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值