NULL,void的区别
void和空指针
void和空指针在计算机编程中,void和空指针是两个常见的概念。
它们分别代表着不返回任何值和指向空地址的指针。
下面将分别介绍它们的含义和用法。
void是一种特殊的数据类型,它表示“无类型”或“没有值”。
在函数定义中,如果函数不需要返回任何值,就可以使用void作为返回类型。
例如,下面是一个不返回任何值的函数:void printHello() {printf("Hello World!\n");}在这个函数中,我们使用了void作为返回类型,因为我们不需要返回任何值。
如果我们使用了其他数据类型作为返回类型,编译器就会报错。
除了在函数定义中使用void作为返回类型外,我们还可以使用void指针。
void指针是一种通用的指针类型,它可以指向任何类型的数据。
例如,下面是一个使用void指针的函数:void printValue(void *ptr, char type) {switch(type) {case 'i':printf("%d\n", *(int*)ptr);break;case 'f':printf("%f\n", *(float*)ptr);break;case 's':printf("%s\n", (char*)ptr);break;}}在这个函数中,我们使用了void指针作为参数,因为我们不知道指针指向的具体类型。
在函数内部,我们使用了类型转换来获取指针指向的具体类型,并打印出对应的值。
空指针是指向空地址的指针,它不指向任何有效的内存地址。
在C语言中,空指针可以用NULL来表示。
例如,下面是一个使用空指针的函数:void printString(char *str) {if(str == NULL) {printf("NULL\n");} else {printf("%s\n", str);}}在这个函数中,我们使用了空指针来判断字符串是否为空。
c语言中的void用法详解
在C语言中,void是一个关键字,用于表示无类型或无返回值。
以下是void在C 语言中的主要用法详解:
1. 函数返回类型:
void通常用作函数的返回类型,表示该函数不返回任何值。
例如:
在上面的例子中,printHello函数没有返回值,因此返回类型是void。
2. 指针类型:
void指针是一种特殊类型的指针,可以指向任何类型的数据。
这在一些情况下是很有用的,例如在动态内存分配和函数参数传递时。
示例:
在上述例子中,genericPointer是一个void指针,可以指向不同类型的数据。
3. 函数参数类型:
void可以用作函数的参数类型,表示该函数不接受任何参数。
例如:
在这个例子中,doSomething函数不接受任何参数。
4. 空指针:
void可以用作表示空指针的类型。
例如:
这里,nullPointer是一个void指针,被初始化为NULL,表示它不指向任何有效的内
存地址。
5. 函数指针:
void也可以用作函数指针的返回类型,表示该函数指针不关心返回值的类型。
例如:
在上面的例子中,functionPointer是一个接受两个整数参数的函数指针,它指向一个
返回类型为void的函数add。
总体而言,void在C语言中的用法涵盖了函数、指针、参数等多个方面,用于表示无类型、无返回值或通用类型。
在方法中void的含义
在方法中void的含义
void,即空参函数,是让计算机不返回任何数据的一种方法。
例如:一些触发
一些操作的函数,或者说运行一段程序的函数,从它的定义上来看,也不会返回任何东西,因此void 类型也被称为“无类型”函数。
在编写代码时,void 常用在函数声明中,表示函数不会返回任何数据类型,
也不会接收任何参数,也就是无返回值函数。
在互联网应用中,void拥有重要的作用,如安全套接层协议(SSL),需要客
户端和服务端建立实现安全通信的拆解重组通道,这是一种无参函数,它的用途就是保证客户端的数据能够与服务器通信安全。
SSL可以进行密码算法、数据加解密等,以避免信息被窃取甚至篡改,并防止身份冒用。
它也可以防止路由器内部网络流量被拦截。
此外,在Web服务器中,某些网页会使用void,用于调节流量。
由于 void
函数无参,不需要做任何业务处理,所以他的运行速度极快,对于需要频繁被调用的程序比较有效,这些程序大多都无需返回值,就是函数的void类型派上用场了。
总之,void 是一种重要的编程技术,它的出现为计算机编程技术提供了更多
的自由度,使得开发人员可以更加灵活有效地处理开发任务,并为计算机使用提供了可靠的安全环境。
void与NULL详解
void与NULL详解
void 是 “空”类型(⽆值型),意思是这种类型的⼤⼩⽆法确定。
并不存在void类型的对象,所以也就不能声明void类型的对象或者将sizeof()运算符⽤于void类型,C++/C语⾔不能对⼀个⼤⼩未知的对象直接操作。
void 通常⽤来定义函数的返回类型,参数列表(⽆参)或者void指针。
void指针可以作为通⽤指针,因为它可以指向任何类型的对象。
void指针与NULL指针值之间的区别:
NULL是可以赋值给任何类型指针的值0,在C语⾔中它的类型为void*,⽽在标准的C++语⾔中由于允许从0到任何指针类型的隐式转换,因此NUll就是整数0.
即:
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
⼀个void*类型的指针是⼀个合法的指针,常⽤于函数参数中来传递⼀个函数与其调⽤者之间约定好的类型的对象地址,例如在线程函数中;⽽⼀个值等于NULL的指针虽也是⼀个合法的指针,但不是⼀个有效的指针。
法律英语翻译词汇:无效的“void”和“null and void”
法律英语翻译词汇:无效的“void”和“nulland void”法律英语翻译词汇:无效的“void”和“null and void”由xx整理收集。
Void可以被翻译为“无效的”。
对于合同、契据、交易及其他行为,如果其没有法律效力,或者不具有当事人所意图产生的法律效力,则是无效的。
null与void同属拉丁语源,意思也是“无效的,无法律约束力的”,null and void这对求同型近义词在正式法律文件中同时使用,表达同一意思,实乃强调。
不过有学者认为“null and void”是叠床架屋式的法律陈词滥调,为法律文体学所不齿,应改用“void”;例1:For example, in many jurisdictions where a person signs a contract under duress, that contract is treated as being void.例如,在很多司法管辖区,任何人在胁迫下签订的合同将被以无效合同对待。
例2 A void civil activity is void ab initio.无效民事行为自始无效。
(关于ab initio的用法,参见用拉丁文“ab initio”来“从头开始”一文)例3:The contract shall be valid for 10 yearsfrom the effective date of the contract. The contract shall become null and void automatically on the expiry of the contract‘s term of validity.本合同的有效期从合同生效之日起算起共计xx年,有效期满后,本合同自动生效。
例4:This certificate shall be considered null and void in case of any alteration.任何修改,本证书将被视为无效。
null是什么意思
null是什么意思
null 有三种意思:
1、是指英语中的一个单词,意思是无效的无价值的、空的。
计算机中通常表示空值,无结果,或是空集合。
2、是指在计算中具有保留的值,用于指示指针不引用有效对象,程序中通常使用空指针来表示条件。
3、是指ASCII码和Unicode码表的第一个字符,其ASCII码值是0,是一个不可见字符,在ASCII码与Unicode码的第一个字符是NULL,它的数值是0。
Null在使用的领域不同,其意思也不同。
第一种null本意是无效的、无价值的、空的。
第二种是在计算机术语中表示具有保留的值,用于指示指针不引用有效对象。
而且程序通常使用空指针来表示条件,例如未知长度列表的结尾或未执行某些操作。
另外空指针的使用可以与可空类型和选项类型中的Nothing值进行比较。
第三种Null是ASCII码和Unicode码表的第一个字符,其ASCII码值是0,是一个不可见字符,在C语言中作为字符串的最后一个字符,以表示字符串到此结束。
但是空字符的能力并不能总是将生成的字符串被正确解释,因为键入会创建一个空字节注入的漏洞,而这个漏洞可能会导致成为一个安全漏洞。
第四种null在数据库术语中表示空值或是值未知。
Null 表示尚未存储数据库字段值。
c语言void与NULL完全解析
c语言void与NULL完全解析作者:朱有鹏1、void类型的本质现在编程语言分2种:强类型语言和弱类型语言。
强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法;弱类型语言中没有类型的概念,所有变量全都是一个类型(一般都是字符串的),程序在用的时候再根据需要来处理变量。
C语言就是典型的强类型语言,C语言中所有的变量都有明确的类型。
因为C语言中的一个变量都要对应内存中的一段内存,编译器需要这个变量的类型来确定这个变量占用内存的字节数和这一段内存的解析方法。
数据类型决定了变量占用的空间大小和内存的解析方法。
所以C语言中变量必须有确定的数据类型,如果一个变量没有确定的类型(就是所谓的无类型)会导致编译器无法给这个变量分配内存,也无法解析这个变量对应的内存。
因此不可能有没有类型的变量,但是C语言中可以有没有类型的内存。
在内存还没有和具体的变量相绑定之前,内存就可以没有类型。
实际上纯粹的内存就是没有类型的,内存只是因为和具体的变量相关联后才有了确定的类型(其实内存自己本身是不知道的,而编译器知道,我们程序在使用这个内存时知道类型所以会按照类型的含义去进行内存的读和写)。
void类型的字面上的含义是:不知道类型,不确定类型,或者说还没确定类型,很多初学者把它理解成空的,这是不对的。
我们以void a为例,void a定义了一个void类型的变量,含义就是说a是一个变量,而且a肯定有确定的类型,只是目前我还不知道a的类型,所以标记为void类型。
在C语言中如果我们去定义一个void a;a=5;去执行它必然出错,因为a还没确定具体数据类型,我们无法给它分配内存空间,故而出错。
那我们什么情况下需要void类型呢?其实就是在描述一段还没有具体使用的内存时需要使用void类型。
典型应用案例就是malloc的返回值。
malloc()函数的原型是void*malloc(size_t size);malloc函数向系统堆管理器申请一段内存给当前程序使用,malloc返回的是一个指针,这个指针指向申请的那段内存。
c语言中 指针的类型
c语言中指针的类型在C语言中,指针是一种非常重要的概念。
它允许程序员直接与内存进行交互,使得对于数据的处理更加灵活和高效。
在C语言中,指针的类型主要包括以下几种:void指针、空指针、指向基本数据类型的指针、指向数组的指针、指向函数的指针、指向结构体的指针、指向联合体的指针、指向指针的指针等。
接下来,我们将逐一介绍这些指针的类型,并且对它们的用法和特点进行详细的解释。
首先是void指针。
在C语言中,void指针是一种通用的指针类型,可以指向任何数据类型。
它的定义形式为:void *ptr。
使用void指针时,需要进行类型转换才能访问指向的数据。
虽然void指针灵活,但是由于它不知道指向的数据的类型,因此在使用时需要谨慎,尽量避免使用void指针,以免在运行时出现类型不匹配的错误。
其次是空指针。
空指针是一种不指向任何有效数据的指针。
在C语言中,空指针用NULL表示。
在定义指针时,可以使用NULL来初始化指针,表示该指针为空。
使用空指针时要注意对其进行判空操作,以避免出现空指针引用的错误。
另外一种是指向基本数据类型的指针。
在C语言中,可以定义指向整型、浮点型、字符型等基本数据类型的指针。
例如,int *ptr表示一个指向整型数据的指针。
通过指针可以方便地对这些数据进行访问和修改。
指向数组的指针也是C语言中常用的指针类型。
数组名可以视为数组的首地址,因此可以使用指针来指向数组。
例如,int arr[5] = {1, 2, 3, 4, 5}; int *ptr = arr;即可定义一个指向数组arr的指针ptr。
通过指针可以对数组进行遍历和操作,这在C语言中是非常常见的用法。
指向函数的指针是C语言中的另一个重要概念。
函数名也可以视为函数的地址,因此可以使用指针来指向函数。
通过指向函数的指针,可以实现回调函数、动态调用函数等功能,这在C语言中是非常有用的特性。
指向结构体的指针是C语言中用于操作结构体的一种常见方式。
c语言中void的意思
c语言中void的意思
在c语言中,void是一种特殊的数据类型,没有具体值,仅表示一种空状态。
它具有多种用途,其中最重要的是提供函数的返回类型,它可以表示函数中没有可返回的值。
void的最重要的特性就是它没有可用值,因此,它可以用作函数的参数类型,也可以用作任何其他类型的变量(但请注意它是没有可用值的)。
除此之外,在C语言的类型转换中,void也可以用作一种中间状态,用于将一种类型转换为另一种类型。
使用void的一个重要场景是指针。
在C语言中,指针是一种重要的数据类型,可以表示内存地址,也可以指向变量、函数或对象(可构造类型)。
指针的定义时,需要在它的括号中指定它所指的类型,它可以是任何类型,当类型不确定时,就可以使用void来表示。
接下来,我们看看void的一个重要应用,即标准库(STL)容器的元素类型。
为了支持任意类型的数据结构,STL容器把类型定义为void,因为它没有可用值,可以构建任意类型的容器。
最后,void还可以用于调试,因为它不会产生任何定义行为,所以可以调试程序中的问题。
总而言之,void是一种重要的c语言数据类型,它没有可用值,可以用作函数的返回类型和参数类型,以及类型转换时的中间状态,也可以用作指针的类型,也可以用作 STL容器的元素类型,还可以用于调试。
因此,void的功能十分强大,在c语言程序开发
中,它经常被广泛使用。
c语言void的用法
c语言void的用法许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。
下面小编就跟大家介绍下c语言void 的用法。
c语言void的用法1.void的含义void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:voida;这行语句编译时会出错,提示“illegaluseoftype'void'”。
不过,即使voida的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:float*p1;int*p2;p1=p2;其中p1=p2语句会编译出错,提示“'=':cannotconvertfrom'int*'to'float*'”,必须改为:p1=(float*)p2;而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void*p1;int*p2;p1=p2;但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
下面的语句编译出错:void*p1;int*p2;p2=p1;提示“'=':cannotconvertfrom'void*'to'int*'”。
Null和undefined的区别?
Null和undefined的区别?
(1)null是⼀个表⽰”⽆”的对象,转我数值是为0,undefined是⼀个表⽰”⽆”的原始值,转为数值时为NaN。
当声明的变量还未被初始化时,能量的默认值为undefined
(2)Null⽤来表⽰尚未存在的对象,常⽤来表⽰函数企图返回⼀个不存在的对象
(3)Undefined表⽰”缺少值”,就是此处应该有⼀个值,但是还没有定义。
典型⽤法是:
a、变量被声明了,但没有赋值时,就等于undefined
b、调⽤函数时,应该提供的参数没有提供,该参数等于undefined
c、对象没有赋值属性,该属性的值为undefined
d、函数没有返回值时,默认返回undefined
(4)null表⽰”没有对象”,即该处不应该有值。
典型⽤法是:
a、作为函数的参数,表⽰该函数的参数不是对象
b、作为对象原型链的终点。
c语言入门-C语言空指针NULL以及void指针
c语⾔⼊门-C语⾔空指针NULL以及void指针空指针 NULL⼀个指针变量可以指向计算机中的任何⼀块内存,不管该内存有没有被分配,也不管该内存有没有使⽤权限,只要把地址给它,它就可以指向,C语⾔没有⼀种机制来保证指向的内存的正确性,程序员必须⾃⼰提⾼警惕。
很多初学者会在⽆意间对没有初始化的指针进⾏操作,这是⾮常危险的,请看下⾯的例⼦:1 #include <stdio.h>2int main(){3char *str;4 gets(str);5 printf("%s\n", str);6return0;7 }这段程序没有语法错误,能够通过编译和链接,但当⽤户输⼊完字符串并按下回车键时就会发⽣错误,在 Linux 下表现为段错误(Segment Fault),在 Windows 下程序直接崩溃。
如果你⾜够幸运,或者输⼊的字符串少,也可能不报错,这都是未知的。
前⾯我们讲过,未初始化的局部变量的值是不确定的,C语⾔并没有对此作出规定,不同的编译器有不同的实现,我曾警告⼤家不要直接使⽤未初始化的局部变量。
上⾯的代码中,str 就是⼀个未初始化的局部变量,它的值是不确定的,究竟指向哪块内存也是未知的,⼤多数情况下这块内存没有被分配或者没有读写权限,使⽤ gets() 函数向它⾥⾯写⼊数据显然是错误的。
我强烈建议对没有初始化的指针赋值为 NULL,例如:char *str = NULL;NULL 是“零值、等于零”的意思,在C语⾔中表⽰空指针。
从表⾯上理解,空指针是不指向任何数据的指针,是⽆效指针,程序使⽤它不会产⽣效果。
注意区分⼤⼩写,null 没有任何特殊含义,只是⼀个普通的标识符。
很多库函数都对传⼊的指针做了判断,如果是空指针就不做任何操作,或者给出提⽰信息。
更改上⾯的代码,给 str 赋值 NULL,看看会有什么效果:1 #include <stdio.h>2int main(){3char *str = NULL;4 gets(str);5 printf("%s\n", str);6return0;7 }运⾏程序后发现,还未等⽤户输⼊任何字符,printf() 就直接输出了(null)。
Java类谜题54:Null与Void
Java类谜题54:Null与Voidpublic class Null {public static void greet() {System.out.println(“Hello world!“);}public static void main(String[] args) {((Null) null).greet();}}这个程序看起来好像应当抛出NullPointerExceptioin特别,由于其main方法是在常量null上调用greet方法,而你是不行以在null上调用方法的,对吗?嗯,某些时候是可以的。
假如你运次该程序,就会发觉它打印出了“Hello World!”理解本谜题的关键是Null.greet是一个静态方法。
正如你在谜题48中所看到的,在静态方法的调用中,使用表达式作为其限定符并非是一个好办法,而这也正是问题之所在。
不仅表达式的值所引用的对象的运行期类型在确定哪一个方法将被调用时并不起任何作用,而且假如对象有标识的话,其标识也不起任何作用。
在本例中,没有任何对象,但是这并不会造成任何区分。
静态方法调用的限定表达式是可以计算的,但是它的值将被忽视。
没有任何要求其值为非空的限制。
要想消退该程序中的混乱,你可以用它的类作为限定符来调用greet方法:public static void main(String[] args) {Null.greet();}然而更好的方式是完全消退限定符:public static void main(String[] args) {greet();}总之,本谜题的教训与谜题48的完全一样:要么用某种类型来限定静态方法调用,要么就压根不要限定它们。
对语言设计者来说,应当不允许用表达式来污染静态方法调用的可能性存在,由于它们只会产生混乱。
c语言void的用法
c语言void的用法许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。
下面小编就跟大家介绍下c语言void 的用法。
c语言void的用法1.void的含义void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:voida;这行语句编译时会出错,提示“illegaluseoftype'void'”。
不过,即使voida的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:float*p1;int*p2;p1=p2;其中p1=p2语句会编译出错,提示“'=':cannotconvertfrom'int*'to'float*'”,必须改为:p1=(float*)p2;而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void*p1;int*p2;p1=p2;但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
下面的语句编译出错:void*p1;int*p2;p2=p1;提示“'=':cannotconvertfrom'void*'to'int*'”。
史上最明白的NULL、0、nul...
史上最明白的NULL、0、nul...C的NULL在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码:int *i = NULL; foo_t *f = NULL;实际上在C语言中,NULL通常被定义为如下:#define NULL ((void *)0)也就是说NULL实际上是一个void *的指针,然后吧void *指针赋值给int *和foo_t *的指针的时候,隐式转换成相应的类型。
而如果换做一个C 编译器来编译的话是要出错的,因为C 是强类型的,void *是不能隐式转换成其他指针类型的,所以通常情况下,编译器提供的头文件会这样定义NULL:#ifdef __cplusplus ---简称:cpp c 文件 #define NULL 0 #else #define NULL ((void *)0) #endifC 的0因为C 中不能将void *类型的指针隐式转换成其他指针类型,而又为了解决空指针的问题,所以C 中引入0来表示空指针(注:0表示,还是有缺陷不完美),这样就有了类似上面的代码来定义NULL。
实际上C 的书都会推荐说C 中更习惯使用0来表示空指针而不是NULL,尽管NULL在C 编译器下就是0。
为什么C 的书都推荐使用0而不是NULL来表示空指针呢?我们看一个例子:在foo.h文件中声明了一个函数:void bar(sometype1 a, sometype2 *b);这个函数在a.cpp、b.cpp中调用了,分别是:a.cpp:bar(a, b);b.cpp:bar(a, 0);好的,这些代码都是正常完美的编译运行。
但是突然在某个时候我们功能扩展,需要对bar函数进行扩展,我们使用了重载,现在foo.h的声明如下:void bar(sometype1 a, sometype2 *b); void bar(sometype1 a, int i);这个时候危险了,a.cpp和b.cpp中的调用代码这个时候就不能按照期望的运行了。
函数中空值的表达
函数中空值的表达
函数中空值的表达可以用null或undefined来表示。
在JavaScript中,null表示一个空对象指针,而undefined表示一个未定义的值。
在某些情况下,null和undefined可以相互转换,但是它们在语义上有所不同。
当函数需要返回一个空值时,可以使用return null或return undefined语句。
在
函数内部,可以使用if语句来判断变量值是否为null或undefined,以便执行相应
的逻辑。
另外,在函数参数中也可以使用null或undefined来表示缺省参数值。
如果调
用函数时某个参数没有传递值,则该参数将被自动赋值为undefined。
如果想要在
函数中检查参数是否传递,可以使用arguments对象来获取传入的值列表。
需要注意的是,在JavaScript中,null和undefined并不是真正的关键字,它们
都是全局对象的属性。
因此,可以使用typeof运算符来判断变量是否为null或undefined。
如果变量的值为null,则其类型为object;如果变量的值为undefined,则其类型为undefined。
C语言的空类型指针,空指针,野指针详解
C语⾔的空类型指针,空指针,野指针详解⽬录空类型指针-void*空指针-NULL野指针造成野指针的原因1.指针未初始化2.指针越界访问3.指针指向的空间已经释放避免野指针总结空类型指针-void*void是空类型,void*是空类型指针,⼜叫万能指针,就是该指针能接收任意类型的指针,可以指向任何类型对象,所以不能对空类型指针进⾏解引⽤,必须强制类型转换成相应的指针类型,才能进⾏解引⽤操作。
空指针类型:作为函数形参类型,可以接收任意类型的指针;作为函数返回值类型,在函数外⾯,将其强制类型转换为相应的指针类型可以与另⼀个void*类型指针⽐较⼤⼩注意:空类型指针不能进⾏解引⽤操作;不能进⾏±整数运算。
空指针-NULL在C语⾔中,空指针NULL指的是地址为0的那块空间#define NULL((void*)0)对于这块空间是不准我们进⾏访问的,所以,对NULL是不能进⾏解引⽤操作的,所以每次对指针进⾏解引⽤操作之前,我们要判断是否为空指针。
野指针野指针是指向⼀个⾮法的或已销毁的内存的指针。
对野指针进⾏解引⽤操作是⾮法的。
造成野指针的原因1.指针未初始化int main(){char* p;//此时p是野指针return 0;}没有对指针p进⾏初始化,此时p就是野指针,如果此时对p进⾏解引⽤操作,⾮法访问内存,程序就会崩溃。
2.指针越界访问int main(){int arr[] = {1,2,3,4,5};int* p = arr;int i = 0;for (i = 0; i < 10; i++){printf("%d ",p[i]);}return 0;}虽然上⾯程序正常运⾏,但是其实越界访问了;只是仅仅访问了⾮法的内存空间,没有改变空间的值,程序有可能没来得及报错,但并不代表程序没有错,但是对于下⾯的代码,程序就会崩溃:int main(){int arr[10] = {0};int i = 0;int* p = arr;for (i = 0; i <= 10; i++){*p = i;p++;}return 0;}因为这⾥⾮法访问内存的同时试图改变空间的值,所以程序崩溃。
c语言中void什么意思
c语言中void什么意思
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use of type 'void'”。
不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1)对函数返回的限定;
(2)对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型
转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
float *p1;
int *p2;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一般把(void*)0定义为NULL
表示这是个空指针
void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的
数据。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果
p1和p2指向不同的数据类型,则必须使用强制类型
转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:
p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包
容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
下面的语句编译出错:
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
但是许多程序员却误以为其为void类型。
例如:
add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
程序运行的结果为输出:
2 +
3 = 5
这说明不加返回值说明的函数的确为int函数。
NULL指针是一个无类型指针,并且值为0。
一个指针,拥有2个属性--地址值和指针类型。
两者的作用是:1,地址值标识变量的首地址(32位系统下指针的地址值占4字节);2,指针类型告诉编译器,应该怎样进行接下来的数据访问(int型数组和float型数组是不同的;数组访问与结构体访问也是不同的;等等)。
NULL的出现是一种约定俗成,事实上它不是C语言中的关键字;把一个指针赋值为NULL,通常的说法是“将指针悬空”。
这样,指针就无法再进行任何数据访问了。
编程工作中有一类比较容易犯的错误--指针地址未进行正确的更新赋值就加以使用,这往往会造成很严重的后果(对内存区进行错误的涂抹)。
所以一个良好的习惯是,当一个指针的工作稍事休息,先把它赋值为NULL,待到再度使用时,重新对其赋值以及进行指针类型转化。
前面说到“NULL指针无法再进行任何数据访问”,其实是视编译器功能而定的。
0位置指向的是程序起始,对于不同的编译器,NULL指针的操作结果是不同的:有些是不准读写,有些是只读,甚至读写都允许。
编译器是人定的。
引用网友win_hate在话题“关于NULL的不严谨”中的话来说:“如果说有谁不严谨了,那必定是读取0位置的程序员,而不是C。
C的设计哲学之一是:…程序员知道自己在干什么--没有安全带‟”。
数据库中的NULL
Null在数据库中表示不知道的数据,主要有3种意思:
1)知道数据存在,但不知道具体值.
2)不知道数据是否存在.
3)数据不存在.
NULL与0的疑惑
NULL与0有着扯不断理还乱的关系,其实不那么高深。
0本身有着一些原生的特性诸如:起始,没有,正负的分界线,0/1中的0还可以表示否定。
NULL正需要这些特性中的一部分。
我们只需要清楚NULL的本质,并在合理的地方才加以利用而非滥用。
譬如我想做一个比较某个整数i是否为0,难道写成i==NULL会比i==0更酷一点吗?
matlab中的函数
函数null用来求解零空间,即满足方程组A*X=0的解空间。
实际上是求出解空间的一组解(基础解系)。
语法:z=null(A)%z的列向量为方程组的正交规范基,满足z… x z=I。
z=null(A,'r') %z的列向量是方程A*X=0的有理基。
PHP NULL
特殊的NULL值表示一个变量没有值。
NULL类型唯一可能的值就是NULL。
[1]
注:NULL类型是php 4 引进的。
在下列情况下一个变量被认为是NULL:
被赋值为NULL。
尚未被赋值。
被unset()。