学校里null啥意思?
我猜你问的是C和CPP中的指针,在C语言中,指针是一种数据类型,它存放在内存中也占用内存,只是指针所指向的内容不一定存在,这种未确定的数据称之为“无定义的”(undefined)或者“空”(null)。用一句通俗的话来解释指针就是一个地址的别名,这个地址可以指向前面的数组、前面的结构体等等,总之前面有什么就指什么;而引用就是直接使用这个地址,比如int*p=&a,这里int*p就是一个新的变量,它的值是一个地址,而这个地址恰好是变量a的起始地址,因此通过*p就可以取得a的首元素。如果现在不想使用p了,想把它赋值为NULL,那么就是把p重新设置为原来的地址值0,即*p=a[0]=1234567891234567,最后的结果就是a依然为前一个数组,但是p已经不指向a了而是指向其他的地方了。
而在Cpp里面,指针不再是一种基本的数据类型,而是一种引用类型,它和整数、浮点数等一样,需要指定具体的类型。并且从C到Cpp一个重要的变化就是引入了左值的概念。左值是指那些可以被赋值的表达式,而右值是指那些不能进行数值运算的表达式。在C中,除了标识符之外,所有的量都有对应的内存地址,所以地址也是可以作为左值的,而Cpp把地址从左值中解放出来并引入了引用类型,这样就使得指针操作变得更复杂。 在C++中对于指向空的操作并没有明确的规定,具体要看所使用的编译器的实现,不过在标准的C++库中一般是可以成功编译的。而对于初始化指针为null的操作,在标准中也是有规定的。
C++规范里面指出,若要把指针初始化为特定值(非0也不是空)是需要满足一定条件的。如果这个条件成立,则指针会被初始化成给定的值,否则会发生运行时错误。这个条件就是指针必须能被解引用来获得一个可读写的对象的首元素。
假设我们有一个对象列表: 我们可以把第一个指针初始化为某个特定的值,例如整个列表的值加上100,那么就得到一个新的指针,而这个新指针是能够被解引用获得正确结果的: 这个结果是正确的,因为++操作先加1再取地址,也就是说这个++把指针移动到了这个对象的下一个元素的起点,然后再把这个对象的第一个元素的值加上100,这样最终结果就等于该对象第三个元素的值再加上123。
但是如果我们把第二个指针也设成相同的值,就会出错,原因是这个值无法通过解引用来找到第二个对象的第一个元素的值: 这个结果就是不正确的。原因是++操作先加上一个数量再去寻址,也就是这个++先把两个指针都挪到了第二个对象的位置,然后在这个基础上再加100,这样最终的值当然就不对了。