一提到NULL,有些学过C的人都比较迷茫;我敢说迷茫的很多很多……海了去了
学了C语言的都知道,NULL多数情况是和指针离不开的;
老师经常告诉你初始化指针为NULL是个好习惯,又告诉你一定要确定传来的指针不能为空!
你特娘想干嘛?让我爱她又不让我睡她?你是想让我做太监吗?
那么究竟什么是NULL?那么NULL又代表了什么?
首先NULL的意思是空,空是什么?是没有!
在初始化一个指针时,比如:int*a=NULL;这句话的意思是指我们定义了一个“可以”指向整型类型的指针,但是让这个指针暂时不指向一个具体的int类型空间;说白了,就是先生成一个指针,但是不给这个指针赋具体的值!
有点抽象?
OK,你要知道,指针也是变量,要用一个变量就要赋值!
在int*a =NULL的时候,实际上在a这个指针变量(4个字节,具体看系统)内,填入了0000 0000 0000 0000 0000 0000 0000 0000.
你会说,这不是赋值了嘛?你的大学老师也会说:初始化指针为0……让指针为零嘛~错,大错特错!因为指针这个变量赋值为NULL,应该是连0都没有,但是总要在这些具体的bit位上写上些什么,于是,就填入了0来填充它的数值空间(总要在所取得数据空间内放入0或1)!!!也就是说,它只是填入0进行位置的填充!
(掌声响起,大力点!)(我摆了摆手……别急,后面更重要……)
因为NULL没有值,所以在理论上并不能用来运算!这也就是为什么要判空!(判别一个指针是不是NULL!)
妈耶,闭环了!因为没有值,所以不能计算,因为不能计算,所以要判断一个指针是不是空指针!
所以,初始化指针为空,和一定要判断指针是不是空指针没有冲突!
千万要注意:将指针=NULL,并不是赋值行为,而是为了初始化一个可以指向一个类型但还没有指向这种类型的具体地址的指针(聪哥大喘气……)
初始化的目的不是为了给初值,而是为了让指针有个类型,这样在后续指向这类型的数据时拿来就用,赋值时可以填入具体的地址数值!
int *a = NULL;
int b =123;
a=&b;
此时,你是不是听的津津有味?那么接下来我将深入说一下NULL:
NULL在C语言中其实是一个宏定义 通常定义为0;
妈耶,怎么又是0?
这里要注意一点,这个0是没有类型的0,不是数值0,而是一串二进制数字0,即(void*)0,后面这个0的内部都是0000……当编译器预处理程序遇到NULL时,它会被替换为0或(void*)0。
当指针被初始化为NULL时,它不可以计算,这样可以避免对未初始化的指针进行解引用(避免用*运算符),从而避免程序崩溃或产生未定义的行为。
NULL这种宏定义的方式允许程序员在代码中使用NULL来初始化或比较指针,但是正如上面所说的,不能用来计算。
当然,作为宏定义(被替换的那个),替换体一定是一个个二进制0嘛?不一定!只要是一个系统决定我们无法取到的地址理论上都是可以的!
对计算机而言,内存地址000……位置,基本上是被系统占用的!所以你将指针指向系统0地址是不被允许的!此乃大逆不道!小小凡人,竟想弑神?
同理,所以有些系统也会给一个不可能操作的、系统保留的地址,将它作为NULL的地址!
此时,你恍然大悟,妈耶,上头有人!这位置不是谁都能占用的!
再提一嘴,我们在C++中,通常使用nullptr这个C++的关键字来表示空指针。
再提一嘴?
好!在ASCII字符-数值对照表中!有一个不可见字符~它就是: \0
它表示空字符,即ASCII码值为0的字符。它在C语言中用于表示字符串的结束。那么它和NULL有关系嘛?
没有!
虽然貌似NULL和'\0'的值都是0,但它们的用途和含义是不同的。
NULL用于指针的判断和初始化一个不指向任何数据的指针,而'\0'用于字符串的结尾。
况且,NULL作为宏定义,指针变量内部的填充不一定为0!
而‘\0'这个字符常量除了内部全部为0之外,还有一个特性,就是它是一个char类型的一个字节的数据!当然不能和占用4个字节的指针作比较!
再提一嘴?
得了吧……再提一嘴就要说不完了……
最后说几句:大学中,C语言的教学按部就班,但是作为一门语言,是应该理解和不断参悟的,求证的过程才是学习的过程,当你对某一个问题和疑点抱有怀疑的态度时,那么接下来的时间将是你吸收知识的最佳状态!
探索C语言,不断挑战自己的软肋!如果你的大学老师告诉你你就这样记就行了,你可以一巴掌扇过去:“你就是这样考研干部的?
哈哈,好了,就这样吧,加班写的,且看且珍惜……
学了C语言的都知道,NULL多数情况是和指针离不开的;
老师经常告诉你初始化指针为NULL是个好习惯,又告诉你一定要确定传来的指针不能为空!
你特娘想干嘛?让我爱她又不让我睡她?你是想让我做太监吗?
那么究竟什么是NULL?那么NULL又代表了什么?
首先NULL的意思是空,空是什么?是没有!
在初始化一个指针时,比如:int*a=NULL;这句话的意思是指我们定义了一个“可以”指向整型类型的指针,但是让这个指针暂时不指向一个具体的int类型空间;说白了,就是先生成一个指针,但是不给这个指针赋具体的值!
有点抽象?
OK,你要知道,指针也是变量,要用一个变量就要赋值!
在int*a =NULL的时候,实际上在a这个指针变量(4个字节,具体看系统)内,填入了0000 0000 0000 0000 0000 0000 0000 0000.
你会说,这不是赋值了嘛?你的大学老师也会说:初始化指针为0……让指针为零嘛~错,大错特错!因为指针这个变量赋值为NULL,应该是连0都没有,但是总要在这些具体的bit位上写上些什么,于是,就填入了0来填充它的数值空间(总要在所取得数据空间内放入0或1)!!!也就是说,它只是填入0进行位置的填充!
(掌声响起,大力点!)(我摆了摆手……别急,后面更重要……)
因为NULL没有值,所以在理论上并不能用来运算!这也就是为什么要判空!(判别一个指针是不是NULL!)
妈耶,闭环了!因为没有值,所以不能计算,因为不能计算,所以要判断一个指针是不是空指针!
所以,初始化指针为空,和一定要判断指针是不是空指针没有冲突!
千万要注意:将指针=NULL,并不是赋值行为,而是为了初始化一个可以指向一个类型但还没有指向这种类型的具体地址的指针(聪哥大喘气……)
初始化的目的不是为了给初值,而是为了让指针有个类型,这样在后续指向这类型的数据时拿来就用,赋值时可以填入具体的地址数值!
int *a = NULL;
int b =123;
a=&b;
此时,你是不是听的津津有味?那么接下来我将深入说一下NULL:
NULL在C语言中其实是一个宏定义 通常定义为0;
妈耶,怎么又是0?
这里要注意一点,这个0是没有类型的0,不是数值0,而是一串二进制数字0,即(void*)0,后面这个0的内部都是0000……当编译器预处理程序遇到NULL时,它会被替换为0或(void*)0。
当指针被初始化为NULL时,它不可以计算,这样可以避免对未初始化的指针进行解引用(避免用*运算符),从而避免程序崩溃或产生未定义的行为。
NULL这种宏定义的方式允许程序员在代码中使用NULL来初始化或比较指针,但是正如上面所说的,不能用来计算。
当然,作为宏定义(被替换的那个),替换体一定是一个个二进制0嘛?不一定!只要是一个系统决定我们无法取到的地址理论上都是可以的!
对计算机而言,内存地址000……位置,基本上是被系统占用的!所以你将指针指向系统0地址是不被允许的!此乃大逆不道!小小凡人,竟想弑神?
同理,所以有些系统也会给一个不可能操作的、系统保留的地址,将它作为NULL的地址!
此时,你恍然大悟,妈耶,上头有人!这位置不是谁都能占用的!
再提一嘴,我们在C++中,通常使用nullptr这个C++的关键字来表示空指针。
再提一嘴?
好!在ASCII字符-数值对照表中!有一个不可见字符~它就是: \0
它表示空字符,即ASCII码值为0的字符。它在C语言中用于表示字符串的结束。那么它和NULL有关系嘛?
没有!
虽然貌似NULL和'\0'的值都是0,但它们的用途和含义是不同的。
NULL用于指针的判断和初始化一个不指向任何数据的指针,而'\0'用于字符串的结尾。
况且,NULL作为宏定义,指针变量内部的填充不一定为0!
而‘\0'这个字符常量除了内部全部为0之外,还有一个特性,就是它是一个char类型的一个字节的数据!当然不能和占用4个字节的指针作比较!
再提一嘴?
得了吧……再提一嘴就要说不完了……
最后说几句:大学中,C语言的教学按部就班,但是作为一门语言,是应该理解和不断参悟的,求证的过程才是学习的过程,当你对某一个问题和疑点抱有怀疑的态度时,那么接下来的时间将是你吸收知识的最佳状态!
探索C语言,不断挑战自己的软肋!如果你的大学老师告诉你你就这样记就行了,你可以一巴掌扇过去:“你就是这样考研干部的?
哈哈,好了,就这样吧,加班写的,且看且珍惜……