C语言指针之NULL

系列文章目录

前言


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、NULL在C和C++中的区别

在C语言中,NULL被替换为一个void*类型的指针右值,值等于0;由于是void*类型,可以隐式转换为其他类型的指针。
在C++中,void*无法自由隐式转换为其他类型的指针,而字面量0可以隐式转换为指针类型。
引入了新的关键字来代表空指针常数:nullptr。

二、指针角度

先看以下定义,p是一个函数内的局部变量,则p的值是随机的,也就是说p是一个野指针。

int func()
{
  int *p; 
  ...
}

再看以下函数,p是一个局部变量,分配在栈上的地址,p的值是(void *)0,实际就是0x00000000,意思就是指针p指向内存的0x00000000地址处。这时候p就不是野指针了。

int func()
{
  int *p = NULL; 
  ...
}

什么是空指针呢?
如果将空指针常量转换为指针类型,则保证生成的指针(空指针)将不相等的值与指向任何对象或函数的指针进行比较。
定义char *p=0后,在之后p的任何一种赋值操作之后,p都会成为一个空指针,即p不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。
什么是空指针常量呢?
值为0的整数常量表达式,或强制转换为void *类型的表达式,称为空指针常量。
空指针指向了哪里的内存
在C/C++中没有标准定义空指针指向何处,取决于系统的实现。我们常见的空指针一般指向0x00000000地址,即空指针内部用全0x00000000来表示,也有一些系统用一些特殊的地址值或特殊的方式表示空指针。
在实际开发中,关键点在于判断哪个是空指针。

NULL的作用
在大部分的CPU中,内存的0x00000000地址处都不是可以随便访问的,所以野指针指向了这个区域可以保证野指针有个存放的地方,否则就会发生段错误。
当尝试访问的时候会阻止你,但是有些地址不是只读的,如果一个指针指向了这个地址,你又在不经意间修改了它,可能会导致一些重要的文件被修改,所以指针初始化成NULL是很有必要的。

三、’\0’和’0’和0和NULL

注意不要混用’\0’和’0’和0和NULL
'\0’是一个转义字符,它对应的ASCII码值是0,本质就是0,;常用于表示字符串的结束标志,以判断字符串有没有到头。
'0’是一个字符,它对应的ASCII码值是48,本质是48。
0是一个int类型的数字,本质就是0。
NULL是一个表达式,是强制类型转换为void *类型的0,一般用来比较指针是都是一个野指针。


说了这么多,那NULL到底是不是0呢?
1.NULL就是0?
先来看一段代码

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

最终输出结果为:
(null)
输出(null),在执行int *p=NULL,打印出来空白,实际上p的值为0x00000000,在C语言中,NULL的本质是0,但是这个0不是当一个整形数据来解析,而是当一个内存地址来解析的,代表的是内存的0地址。
(void *)0这个整体表达式表示一个指针,地址在哪里取决于指针变量本身,这个指针变量指向0地址(实际是0地址开始的一段内存)。
2.NULL不是0?
如果一个指针被赋予NULL,相当于这个指针执行了0x00000000这个逻辑地址,但是在C语言中0x00000000这个逻辑地址用户是不能使用的,所以当你试图取一个指向NULL的指针的内容时,就会提示段错误,例如以下代码:

#include<stdio.h>
int main()
{
    int* node = NULL;
    int p = 0;
    p = *node;
    printf("%d\n", p);
    return 0;
}

编译运行会报错。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值