系列文章目录

前言

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

二、指针角度

三、’\0’和’0’和0和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提供了大量能使我们快速便捷地处理数据的函数和方法。

C语言指针之NULL相关推荐

  1. c语言指针赋null,构造体指针赋值为NULL, 不被执行

    结构体指针赋值为NULL, 不被执行 最近用c实现基本数据结构,用的codeblocks+gcc.二叉树这里出了点问题,请高手指点一下: 实现的是基本的二叉树操作:初始化,左插入,又插入,左删除,右删 ...

  2. 关于C语言指针赋值NULL的小心得

    正确示范: main() { int a=3, *b=NULL; b=&a printf("%d", *b); } 错误示范: main() { int a=3, *b=N ...

  3. 取消对 null 指针“l”的引用。_C语言编程笔记丨C 语言指针 5 分钟教程

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...

  4. C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针

    const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...

  5. c语言获取指针分配的字节数,c语言指针知识点总结(共6篇).docx

    c语言指针知识点总结(共6篇) C语言指针教学中的知识点分析与总结 摘要:分析指针的基本概念及指针在数组.函数.字符串.动态存储分配等方面的应用,提出指针教学过程中易混淆概念及注意事项,对初学者深入理 ...

  6. C 语言指针 5 分钟教程

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...

  7. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)

    C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的 ...

  8. c语言指针的相关运算,C语言指针的运算

    本文讨论使用指针进行的运算,最重要的运算是获取指针所引用的对象或函数.也可以比较指针,使用指针来遍历一个内存区域. 使用指针读取与修改对象 间接运算符 * 生成内存中的位置,该位置的地址存储在一个指针 ...

  9. c语言首尾指针相同 则,6.C语言指针练习题.doc

    6.C语言指针练习题.doc 一.知识点 1.? 掌握指针.地址.指针类型.空指针(NULL)等概念: 2.? 掌握指针变量的定义和初始化.指针的间接访问.指针的加减运算.指针变量比较运算和指针表达式 ...

最新文章

  1. ubuntu16.04 配置双网卡机器
  2. LAMP 系统性能调优:第2 部分: 优化Apache 和PHP-学习笔记
  3. 107. 二叉树的层序遍历 II and 102. 二叉树的层序遍历 023(BFS模板题打两道)
  4. 无服务器-仅仅是构建现代应用程序的一种方法?
  5. Java关键字new和newInstance的区别
  6. SAP云解决方案和企业本地部署(On-Premise)混合架构下的安全认证权限管理
  7. weblogic 正在启动 wsee服务_详解LINUX安装部署weblogic集群--第二部分
  8. html遮罩水印,CSS滤镜遮罩,图片水印效果
  9. 合肥师范学院计算机组成原理实验,计算机组成原理实验教学探索
  10. 微信小程序开发入门介绍-布局组件
  11. c语言求余运算作用,C语言中的整数除法和求余运算
  12. Could not resolve project
  13. 2020Spatial-Temporal Graph Convolutional Network for Video-based Person Re-identification论文笔记(时空图卷积)
  14. 1072. 开学寄语(20)
  15. bzoj 4318 osu 【三次方问题】【dp】
  16. 网站空间与服务器的区别,网站空间与服务器的区别
  17. 9型人格人口占比数据_数据人格
  18. Java后端实习总结--福州之旅
  19. 2020中兴软件测试面经
  20. readlink /var/lib/docker/overlay2/l: invalid argument报错解决

热门文章

  1. 关于富士通DPK200G打印增值税发票的设置方法
  2. phtoshop CEP扩展 读取xls文件内容
  3. http错误500.21解决方法
  4. 快速理解Vue父子组件传值
  5. Docker help命令和镜像命令、虚悬镜像dangling images的创建和删除
  6. 直播美颜技术的演进及其应用:直播美颜SDK详解
  7. #bss段,data段和text段
  8. win10开启蓝牙虚拟串口
  9. 基于APB与I2C的多主多从架构设计
  10. STM32_GPIO