首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我在声明中说int*p = NULL,但在测试中p!= NULL,为什么不用*p!= NULL来匹配声明?

在声明中,int* p = NULL; 表示将指针p初始化为一个空指针,即指向内存地址为0的位置。而在测试中,p != NULL 表示判断指针p是否指向了一个非空的内存地址。

在C/C++中,指针是一种特殊的变量类型,它存储了一个内存地址。当我们声明一个指针变量时,可以选择将其初始化为一个特定的值,如NULL。NULL是一个宏定义,表示一个空指针常量,其值通常为0。

在测试中,p != NULL 是在判断指针p是否指向了一个有效的内存地址。如果p不等于NULL,说明p指向了一个非空的内存地址,即p已经被正确地初始化为一个有效的指针。

p != NULL 是在判断指针p所指向的内存地址中的值是否为NULL。这种比较通常用于判断指针所指向的内存中是否存储了有效的数据。在这个问题中,并没有涉及到p的具体值,因此不需要使用*p != NULL 来匹配声明。

总结起来,int p = NULL; 是将指针p初始化为空指针,而p != NULL 是判断指针p是否指向了一个非空的内存地址。而p != NULL 则是判断指针p所指向的内存中的值是否为NULL。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 11 nullptr关键字

除了NULL之外,C++11新标准又引入了nullptr声明一个“空指针”,这样,我们就有下面三种方法获取一个“空指针”:如下:int *p1 = NULL; // 需要引入cstdlib头文件int...*p2 = 0;int *p3 = nullptr;新标准建议使用nullptr代替NULL声明空指针。...C/C++NULL到底是什么我们查看一下C和C++的源码,不难发现:1.NULLC++的定义,NULLC++中被明确定义为整数0:/* Define NULL pointer value */...NULL ((void *)0) #endif /* __cplusplus */#endif /* NULL */2.NULLC的定义.CNULL通常被定义为如下:#define...为什么要引入nullptrC++把NULL定义为0,解决了函数重载后的函数匹配问题,但是又引入了另一个“问题”,同样是上面这段代码:void Func(char *);void Func(int);int

2.4K20

Java8-19新特性一览 ,认识全新的前沿技术

现在,Java也走类似的路,能明显看到它在将一些优秀语言的亮点容纳到自己的新版本,这种趋势代表着一个意义:Java不断进步。...从这一点,学习Java完全是值得的,作为一门成熟优秀且严谨的语言,它就像一个白领一样正襟危坐。...2)、案例 案例包含两个测试,一个是直接测试var声明的变量是否能自己推断类型,一个是循环中使用的效果。...3)、注意 1)、sealed声明的父类,它的子类只能用final、sealed、non-sealed修饰; 2)、sealed声明的父类,至少要有一个子类; 3)、没有permits授权的子类...这里特别说一点,sealed和record其实在Java新特性模式匹配很有意义,但是认为模式匹配对于从未了解过的Java程序员来讲有些晦涩,结合sealed后有种套娃传销的感觉,如果难于理解就不是我们本来的目的

14710
  • C#7.0有哪些新特性?

    如果你没有初始化这些变量,你就无法使用 var 声明它们,除非先指定完整的类型: public void PrintCoordinates(Point p) { int x, y; // have...由于输出变量直接被声明为实参传递给输出形参,编译器通常会告诉他们应该是的类型(除非有冲突过载),所以使用 var 代替声明它们的方式是比较好的: p.GetCoordinates(out var x,...默认的语句还是最后被判断:尽管 null 的 case 语句最后语句之前出现,它也会在默认语句被选中之前被测试。这是与现有 Switch 语义兼容的。然而,好的做法通常会将默认语句放到最后。...Switch 不会到最后的 null 语句:这是因为当前 IS 表达式的例子具有类型匹配,不会匹配null。...deconstructing declaration WriteLine($"found {first} {last}."); 解构声明,您可以使用 var 声明单独的变量: (var first

    1.6K80

    熬夜整理的万字CC++总结(二),值得收藏

    要使一个指针为NULL,可以给它赋值一个零值。为了测试一个指针百年那个是否为NULL,你可以将它与零值进行比较。 对指针解引用操作可以获得它所指向的值。...int arr[5]; int *p = * (&arr); int arr1[5][3] arr1 = int(*)[3]&arr1 1)指针声明时,* 号表示所声明的变量为指针 2)指针使用时,...,也就是,函数的形参是实参的拷贝份,形参和实参只是值上面一样,而不是同一个内存数据对象。...= NULL) { //free()函数的功能只是告诉系统 p 指向的内存可以回收了 // 就是p 指向的内存使用权交还给系统 //但是,p的值还是原来的值(野指针),p还是指向原来的内存...指针变量和其他变量一样,占据内存某个特定的位置,所以用&操作符取得它的地址是合法的。 那么这个变量的声明是怎样的声明的呢? int **c = &b; 那么这个**c如何理解呢?

    1.2K20

    数据结构_单链表(C++

    node *N = NULL) //含缺省参数的构造函数 { data = e; next = N; } };==这里一定要注意为什么提前声明sList以及为什么node类将sList类看作友元类...pos位的前一个,数据插在pos的位置就是插在p的后面,如果p尾节点,插入p的后面是没问题的,如果p走到了节点的尾部也就是尾结点的next也就是NULL,那说明pos肯定是超出了范围,否则在此之间p...就能走到pos的前一个位置而终止循环 ​ 插入是可以尾插的,即pos的位置是最后一个节点的后面,或者NULL的前面,此时p尾结点 ​ while里面j的作用是判断有没有走到pos的位置之前,如果j...next; } } 题目 ==下面这些函数都是直接在上面写好的单链表头文件(sList.h)作为了成员函数声明的,并在另一个文件定义的== 当然也可以不用作为成员函数,而是重新写一个头文件和源文件...a的大的,因此不用判断大小,全部给到a就可以,而且直接连接上结点就可以,不用新开结点再赋值 { i->next = j; } cout << "并集是" << endl; for (int

    97330

    【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性

    大家好,是黄啊码,最近说到php从入门到拆门,有网友,门都还没进,怎么拆门?那咱们现在就从php7说起,至于入门的太简单,就略过了,大家加油,不懂Q吧。...据网友测评,PHP 7+ 版本极大地改进了性能,一些WordPress基准测试当中,性能可以达到PHP 5.6的3倍。  ...PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式: 强制模式 (默认) 严格模式 标量类型声明语法格式: declare(strict_types=1); 代码通过指定 strict_types...这玩意看上去是不是特别熟悉,学习过java或者.net的应该特别清楚吧,就是啥都不用返回,而在php7返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return...> 输出结果分别为:1    1  有网友,php都到8了,为什么你还跟我php7,想问,php都到8了,为什么你写代码还用5呢?所以不是新的不好,而是老的稳定,毕竟姜还是老的辣。

    1.2K40

    总结---5

    C语言中,关键字static有三个明显的作用: 1). 函数体,一个被声明为静态的变量在这一函数被调用过程维持其值不变。 2)....模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3)....顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么为什么还要如此看重关键字const呢?也如下的几下理由: 1)....6"); } 这个问题测试你是否懂得C语言中的整数自动转换原则,发现有些开发者懂得极少这些东西。...(2) char **p, a[16][8];  问:p=a是否会导致程序以后出现问题?为什么

    871100

    C# 7.0 探索之旅

    C# 7.0 的模式的例子有: 无序列表c(c 为 C# 的一个常量表达式)形式的常量模式(Constant pattern),测试输入是否等于 c T x(T 为一个类型,x 为一个标识符)形式的类型模式...(Type pattern),测试输入是否有类型 T,并在满足条件的时候将值提取成全新的 T 类型的变量 x var x(x 为一个标识符)形式的变量匹配(Var patterns),这种匹配总是能够成功...最后的 null 子句不会无法到达: 这是因为类型模式(的行为)以目前的 is 表达式为例子,且不会与 null 匹配。...我们添加了 out 变量;使你能够传入一个 out 参数的地方声明一个变量: public void PrintCoordinates(Point p) { p.GetCoordinates...(为什么它使用 out 参数而不是返回一个元组?那是因为这样一你可以对不同的值的数量拥有不同的重载了)。

    1.3K90

    三分钟基础知识:什么是栈?

    很多刚刚学习的小伙伴学习数据结构实际没怎么见到应用,那是因为你没有去仔细的观察,而且像栈这常用到的数据结构通常会使用在实际开发,比如:表达式的运算、花括号的匹配以及浏览器的前进后退等等很多。...= null) { System.out.print(p.data + " "); //指向下一个结点 p = p.next;...可以根据之前的文章分析《佩奇学编程 | 复杂度分析原来这么简单》。 4 栈的实际应用 既然我们把栈的性能分析透了,理解透了,那么我们看看栈实际中有哪些应用吧。...4.1 应用一 :栈函数的应用 函数我们每个人再熟悉不过了,你是不是很纳闷,栈怎么会在函数能够应用的到呢,学了这几年函数,咋不知道函数还有栈的操作。...我们这时要想一个问题,那为什么函数会使用栈这种数据结构呢,为什么不用队列、链表或者其他数据结构?全体注意,重点来了,以后分析其他的问题也用到一下的方法分析。

    1.8K10

    Javascript基础回顾 之(一) 类型

    那么到底哪些地方好玩,为什么好玩呢?我们一起玩玩吧,让我们玩着玩着就把Javascript理解透彻了。...好玩之一: 声明但未赋值 和 未声明的变量都是 undefined 好玩之二: 只有声明并赋值为null,它的值才会null 好玩之三: typeof(Object) 竟然是一个function 好玩之四...其实null == undefined就是硬性规定,ECMA规定它们做相等性测试的时候要返回true所以他们返回true了。就好像我们C#里面重写了equlas 方法一样。...int Age { get; set; } } class Program { static void Main(string[] args) { var p =new...function类型   function类型有两种,函数声明和函数表达式。函数声明具有优先级,可以声明之前被使用,表达式却不能。

    40950

    Javascript基础回顾 之(一) 类型

    那么到底哪些地方好玩,为什么好玩呢?我们一起玩玩吧,让我们玩着玩着就把Javascript理解透彻了。...好玩之一: 声明但未赋值 和 未声明的变量都是 undefined 好玩之二: 只有声明并赋值为null,它的值才会null 好玩之三: typeof(Object) 竟然是一个function 好玩之四...其实null == undefined就是硬性规定,ECMA规定它们做相等性测试的时候要返回true所以他们返回true了。就好像我们C#里面重写了equlas 方法一样。...int Age { get; set; } } class Program { static void Main(string[] args) { var p =new...function类型   function类型有两种,函数声明和函数表达式。函数声明具有优先级,可以声明之前被使用,表达式却不能。

    71670

    深入浅出C指针,细节之处见真章,拒绝一切无病呻吟!!!

    挺好的,也有一些粉丝私信我出C++的,也有一些粉丝还是有点把握不住,其实写完之后会开一个话题讨论,口头阐述并解释一下文章内容,一般写完之后的当天晚上或第二天晚上,把握不住的小伙伴可以来听听。...C++的安排上了,但是指针想先安排一下。 前面写过一篇指针的,反响还不错,但是个人感觉还是欠缺火候。于是,又闭关三天,拿出这一篇。 ---- 认识指针篇 为什么要熟练指针?...为什么要谈指针色变呢? ---- 指针一定要在声明时初始化? 难度指数:1颗星 / 细节指数:2颗星 / 重要指数:3颗星 无稽之谈。也不知道为什么有的人会这么,是不是从某本书上看来的啊。...const int* 对象赋值给int* p = &b; //将指针指向另一个对象 //*p = 100; //表达式必须有一个可以修改的左值 //我们可以用p解引用,但是不能用p修改它,即使它是一个普通变量...另一种情况就是声明函数指针,其实函数表示法就是指针表示法(以前老师有跟我们过)。

    29720

    数据结构_队列(C++

    [toc] 前言 没什么好说的 也就是 队列一般用链表实现比较常用,下面实现的也是链式栈 ==注意下面类的提前声明和友元类的作用== ==assert果然还是太暴力了,能不用不用吧,但是一定要记住要判断...: Node() { next = NULL; }; Node(const elemType &x, Node *p = NULL) { data = x; next = p; } };==这里一定要注意为什么提前声明...queue以及为什么Node类将queue类看作友元类== ==还要注意== ==类的向前声明的时候类后面不加模板参数,但是前面一定要有参数模板的声明;== ==友元类后面一定要有模板参数== ==就按上面的写法...} tail = NULL; } 练习 有些函数直接作为了上面实现的队列的成员函数,用的时候别忘了queue.h声明 用两个队列实现栈 template //先写一个求队列元素个数的函数...p); if (head == NULL) tail == NULL; } int i_best() { if (!

    31330

    开发成长之路(3)-- C语言从入门到开发(讲明白指针和引用,链表很难吗?)

    栗子来一颗: int a; int &at = a; //上述声明允许将at和a互换,它们指向相同的值和内存单元,就像连体婴一样。 上面这个栗子其实很有内涵在里面 为什么不写成下面这个形式呢?...int a; int &at; at = a; 指针是可以的,但是&不允许,&必须在声明时将其初始化。 引用经常被用作函数参数,使得函数的变量名成为调用程序变量的别名。...int age = 20; const int * pt = &age; //该声明指出,pt指向一个const int,因此不能使用pt修改这个值。...//就是age可以改,只不过不能用pt改而已。 注意点:不允许将常量数据赋值给非常量指针,个中理由就不用多解释了吧。...函数指针完成任务的流程是这样的: 获取函数的地址 声明一个函数指针 使用函数指针调用函数 获取函数地址 获取函数地址那是比较简单的事,如果 void Hanshu();这是一个函数,那么它的地址就是

    58220

    Java HashCode详解

    也就是,我们先通过 hashcode判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 在这个桶里找到我们要的类。 那么。...根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此Object类并没有给出具体的实现。   对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。...Java也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。   为什么这么呢?...,所以这里存在一个冲突解决的问题,这样一实际调用equals方法的次数就大大降低了,通俗一点:Java的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)...; m.put(p,"student"); System.out.println(p1.hashCode()==p.hashCode()); System.out.println("要得到刚刚的对象"

    4K50

    记64位地址截断引发的挂死问题

    %p\n",p); return p; } 上面两段代码再简单不过,testFun函数申请一段内存,并返回。...也就是,如果函数实际有返回值,但是函数返回值类型却没有指明,编译器会将其默认为int。...= testFun(); ^ 两个警告的意思分别为: testFun没有声明 尝试从整形转换成指针 第一个警告很容易理解,虽然定义了testFun函数,但是main函数并没有声明。...extern声明 头文件声明,调用者包含该头文件 按照第一种方式,main.c增加一行声明: extern void *testFun(); 运行结果: 0x7fffee1bd7b0 malloc...本文总结如下: 不要忽略任何一个警告,除非你非常清楚地知道自己在做什么 头文件声明函数,并提供给调用者 函数使用前进行声明 问题长期定位不出来时,休息一下 尽量编写通用性代码 非必要时不强转 使用void

    87620

    Null 值及其处理方式

    如果我们直接使用 0 表示空指针,那么当存在 int 和 Foo* 的重载场景下,会导致 NULL 选择 int 而非 Foo* 的版本,一般来说这并不是我们想要的。...null 其实就是 C++ 的空指针,也就是,使用 null 和 C++ 中使用 nullptr 并没有太本质的区别。...至于 Python 这边,就比 Java 要好点,因为 Python 是动态类型的语言,所以不用考虑搞什么特殊值表示 null,直接用一个特殊的类的对象表示就可以了,只要大家约定好,都用一个类型的一个值表示...这样写起来相当直观也很方便,不用担心中途对一个 null 进行方法调用而抛出异常,也不需要写太多的代码进行类型的收窄或者类型的转换。...传统的 Java 代码我们可以这样写: Student s = null; Person p = s; Kotlin ,强制了 null 的检查,所以代码应该这样写: val s: Student

    1.2K40

    整理了70道C语言与C++常见问答题

    「注意」:虽然不用条件编译命令而直接用if语句也能达到要求,但那样做目标程序长(因为所有语句都编译),运行时间长(因为程序运行时间对if语句进行测试)。...解决办法:指针声明时初始化,可以是具体的地址值,也可让它指向NULL。 指针p被free或者delete之后,没有置为NULL。解决办法:指针指向的内存空间被释放后指针应该指向NULL。...例如int *p = new float[2];就会报错;而int p = malloc(2sizeof(int))编译时编译器就无法指出错误。 new一般分为两步:new操作和构造。...「注意」模板及其特例化版本应该声明同一个头文件,且所有同名模板的声明应该放在前面,后面放特例化版本。...也就是map内部使用的Alloc并不是map声明的时候从参数传入的Alloc。 67 set的底层实现实现为什么不用哈希表而使用红黑树?

    3K01

    Java魔法堂:解读基于Type Erasure的泛型

    二、认识泛型                             介绍之前先定义两个测试类,分别是 类P 和 类S extends P 。 1....为时,无法向集合添加除null外的其他类型的实例。(null属于所有类的子类,因此可以赋予到未知类型) List<?...我们可以向非泛型集合添加任何类型的元素, 而通配符的泛型集合则只允许添加null而已, 从而提高了类型安全性. 而且我们还可以使用带限制条件的带边界通配符的泛型集合呢! 3. 声明带边界通配符 ?...Code Sharing:对每个泛型只生成唯一一份目标代码,该泛型类的所有实例的数据类型均映射到这份目标代码需要的时候执行类型检查和类型转换。...()返回值类型为Object,那么为什么要加(T)进行显式的类型转换呢?

    1.1K80

    【C→C++】打开C++世界的大门

    那现在就想在函数f2()打印全局的a,有没有办法? 有的: 确实打印出来了,那那两个冒号是什么东西啊,为什么a前面加了这个符号就打印全局a了? ,::叫做 作用域限定符。...拿为什么呢? 大家可能会想,这类型都不一样,肯定不行了。 刚开始也是这么想的,但是: 欸,为什么啊? 为什么加一个const就可以了呢?x就可以成为i的引用(别名)了吗?...int main() { f(0); f(NULL); return 0; } 这两次函数调用会如何匹配?...欸,NULL不是指针嘛,为什么f(NULL);调用的也是第一个函数呢? 原因在于NULLC++ 的定义发生了一些改变。...NULL实际是一个宏,传统的C头文件(stddef.h),可以看到如下代码: 意思呢就是C++NULL其实就是0。

    17110
    领券