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

void指针和NULL指针有什么区别?

void指针和NULL指针是C语言中的两个概念,它们在指针的使用上有一些区别。

  1. void指针:
    • 概念:void指针是一种特殊类型的指针,可以指向任意类型的数据,但不能直接操作指向的数据。
    • 分类:void指针没有具体的类型,因此不能进行解引用操作,需要进行类型转换后才能使用。
    • 优势:void指针的灵活性较高,可以用于处理不同类型的指针,尤其在函数参数传递和内存分配等场景中比较常见。
    • 应用场景:常见的应用场景包括函数指针、动态内存分配、回调函数等。
    • 腾讯云相关产品:腾讯云提供了云服务器、云函数等产品,可以用于支持各种类型的应用场景。具体产品介绍请参考腾讯云官方网站:https://cloud.tencent.com/
  2. NULL指针:
    • 概念:NULL指针是一个特殊的指针常量,表示指针不指向任何有效的内存地址。
    • 分类:NULL指针的类型是整型,通常定义为0或者(void*)0。
    • 优势:NULL指针可以用于判断指针是否有效,避免野指针的访问。
    • 应用场景:常见的应用场景包括指针初始化、指针判空等。
    • 腾讯云相关产品:腾讯云提供了云监控、云安全等产品,可以用于保障云计算环境的安全性。具体产品介绍请参考腾讯云官方网站:https://cloud.tencent.com/

总结:void指针和NULL指针在指针的使用上有一些区别。void指针是一种特殊类型的指针,可以指向任意类型的数据,但不能直接操作指向的数据;而NULL指针是一个特殊的指针常量,表示指针不指向任何有效的内存地址。它们在应用场景和使用方式上有所不同,但都在云计算领域中有一定的应用价值。

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

相关·内容

void 指针笔记

void 指针笔记 void 指针 void指针可以用来保存所有数据类型的地址(即,通用指针),例如: void* test1 = new XXXClass(); int nValue; float...= &nValue; // valid pVoid = &fValue; // valid pVoid = &sValue; // valid 但是其他类型的指针不一样的地方是,void 指针不知道自己保存的地址的内容的数据类型...= static_cast(pVoid); // 将void指针转换成int指针 cout << *pInt << endl; // 成功解引用 应用 例如说经常用的memcpy,将指定范围内的数据移动到指定的内存地址...要注意一下,可能会出现目标地址刚刚好就在源地址要复制的内容中间的情况,即要复制的范围要写数据的范围重叠了,这时候就会出错。所以如果是面试题的话应该写memmov,而不是直接答上面的memcpy。...参考 StackOverflow: What is a void pointer and what is a null pointer?

62720

初识指针指针指针变量、如何理解地址、指针类型的意义、void*指针、野指针、空指针)(笔记)

解引用 return 0; } 二、指针指针变量 指针:地址 指针变量:变量-存放地址 指针变量用来存放地址的,指针变量并不完全等同指针...), 但是硬件硬件之间相互独立,故用"线"连接起来(物理上的), 而CPU内存之间也有大量的数据交互,所以两者也用线连接起来。...四、指针类型的意义(为什么不用ptr_t p代表所有指针) 1.指针解引用的时候多大权限 (如果一个指针代替所有的话,解引用时的字节与变量定义类型不同) 2.指针类型决定了指针向前或向后走一步多大...,但是int型四个字节 printf("%p", *pa); return 0; } /*指针解引用的时候多大权限*/ int main() { int a = 10; int* pa =...*指针:无具体指针(泛型指针) 这种类型的指针可以用来接受任意类型的地址,但也有局限性, void*类型的指针,局限性在于他不能直接进行指针的+-整数和解引用的运算 什么用: 一般void

7310

void指针进阶用法

测试环境采用 IAR for ARM 8.40.1 什么是void指针 void指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。...当某个指针void指针时,所指向的对象不属于任何类型。 因为void指针不属于任何类型,则不可以对其进行算术运算,比如自增,编译器不知道其自增需要增加多少。...比如char *型指针,自增一定是指针指向的地址加1,short *型指针自增,则偏移2。 在C/C++中,在任意时刻都可以使用其它类型指针来代替void指针,或者用void指针来代替其他类型指针。...指针的本质,是其值为一个地址,那么延伸一下: 当使用关键字void声明指针变量时,它将成为通用指针变量。 任何数据类型(char,int,float等)的任何变量的地址都可以赋值给void指针变量。...因此,要获取由void指针指向的数据,需要使用在void指针位置内保存的正确类型的数据进行类型转换。

1.7K10

voidvoid指针含义的深刻解析

void指针使用规范 ①void指针能够指向随意类型的数据,亦就可以用随意数据类型的指针void指针赋值。...众所周知,假设指针p1p2的类型相同,那么我们能够直接在p1p2间互相赋值;假设p1p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。   ...由于“无类型”能够包容“类型”,而“类型”则不能包容“无类型”。道理非常easy,我们能够说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。...规则四假设函数的參数能够是随意类型指针,那么应声明其參数为 void*   典型的如内存操作函数 memcpy memset 的函数原型分别为: void * memcpy(void...这个世界上的变量都是“类型”的,譬如一个人不是男人就是女人(还有人妖?)。

95410

你必须知道的指针基础-7.void指针与函数指针

一、不能动的“地址”—void指针 1.1 void指针初探 ?   void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。...用int表示指针异曲同工,只是更明确是“指针”。   因此void*只能表示一个地址,不能用来&取值,也不能++--移动指针,因此不知道多少字节是一个数据单位。...PS:void *就是一个不能动的“地址”,在进行&、移动指针之前必须转型为类型指针。 1.2 void指针的用途 ?   ...{1,3,5,6}:length=4 // 比较data1data2指向的数据做比较, // 如果data1>data2,则返回正数 void *getMax(void *data,int unitSize...sizeof(dogs)/sizeof(Dog);i++) { printf("%s %d ",dogs[i].name,dogs[i].age); }   那么,快速排序后是否结果呢

91620

函数参数的传值指针什么区别

前言 我们可能听过C语言中的传值指针,在其他语言中,也有传引用一说,那么他们到底什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。...调用swap前后 由于在swap中永远只是对ab的副本进行操作,因此完全不影响原始的ab的值。最终也不可能达到交换ab的值的目的。 传指针 那么为解决上面的问题,我们知道,需要传指针。...从图中可以看出,虽然传递给函数的是指向ab的指针的副本,但是它的副本同样也是指向ab,因此虽然不能改变指针的指向,但是能改变参数ab指向的内容,即改变原始ab的值。...main(void) { int *p = NULL; getMemery(p); printf("address of p is %p\n",p); return 0...main(void) { int *p = NULL; getMemery(&p); printf("address of p is %p\n",p); free(p)

3K30

NULL指针的奇妙之旅

今天带大家了解下NULL指针是如何形成的? 当然了我们要深入到操作系统中去看看为何访问一个NULL指令会报Segment Fault的错误。...想必大家在接触计算机时都写过NULL指针的程序,尤其是玩C语言的小伙伴们。比如刚初始化的一个int类型指针,还没给分配内存空间时就往这个指针赋值,然后运行就会出现Segment Fault的错误。...当创建一个子进程后,会通过exec程序来装载该NULL指针程序的内容。当程序运行起来后,操作系统就会为NULL指针程序load好各个段 ?...一个程序跑起来,操作系统会自动为其挂载好各个段,我们常见的几个段: 数据段:分为只读数据段,可读可写数据段 代码段:就是我们写的code,一般权限都是RX的 堆: 一般用来映射mallo申请的内存区域或者...至此一个简单的NULL指针的旅行就完毕了,可见还是相当的复杂的。

1.1K20

Go通关17:Go指针unsafe.Pointer什么区别

❞ uintptr 指针类型 uintptr 也是一种指针类型,也可以表示任何类型, unsafe.Pointer 的区别是,「uintptr 可以进行运算」。...可以通过函数 unsafe.Offsetof 计算出来,该函数返回的是一个 uintptr 类型的偏移量,了这个偏移量就可以通过 + 号运算符获得正确的 Age 字段的内存地址了,也就是通过 unsafe.Pointer...了指向字段 Age 的指针变量 pAge,就可以对其进行赋值操作,修改字段 Age 的值了。...主要用于指针类型的转换,是各个指针类型转换的桥梁。...unsafe.Sizeof Sizeof 函数可以返回一个类型所占用的内存大小,这个大小只与类型有关,类型对应的变量存储的数据大小无关,比如 bool 型占用一个字节、int8 也占用一个字节。

27940

C语言中的函数指针(*(void(*)())0)();

个人总结一下C语言中有关函数的知识,如有问题请留言指明*v* (*(void(*)())0)(); 其实这个语句只有在微处理器最底层才有可能被调用,因为应用层几乎没有直接对一个地址进行操作的。...第三个问题:这个地方也是比较绕的地方,我们直接定义一个函数指针时要指明函数的返回值类型以及入参类型等,正常我们定义一个一个int入参没有返回值的函数指针变量是 void (*funcp)(int);,...函数指针变量整形变量相对比的话,void (*)(int) 就相当于int,而变量名funcp就和a等同了。...看到这里,再回头看看上面的(*(void(*)())0)();语句,你会发现(void(*)())0是将0强转成无返回值无入参的函数指针地址,外面一层就是取地址执行函数。...函数指针相关的知识点还是很重要的,在一些较大的项目中,我们经常会看到这样的语句 typedef void (*HANDLER) (int);,这是定义一种函数指针类型,后面直接使用HANDLER就可以定义入参一个

1.7K20

指针常量常量指针

指针常量 顾名思义 这是一个指针类型的常量!常量的特点就是不可改变,所以被指针指向的常量地址也是不可以变的。...可以看到我们在定义并初始化一个指针常量之后,再次修改它的指向是不被允许的,但是它指向地址的值是可以改变的 常量指针 本质上是一个指针,常量表示指针指向的内容 比如整型指针 字符指针 等等 常量指针指向的内容是不可改变的...这里不再赘述 那我们是否能修改指针指向 改变字符串的内容 str = "orange"; 答案也是不能 orange也存放在常量区 他在常量区的地址也就是字符串的首地址 但是str是指针常量 不可以修改...1.如果想要实现修改str,首先要去掉指针常量 使他可以修改指向的地址 然后就可以指向常量区新的内存地址 2.也可以把指针常量改成常量指针(可以修改指针指向 不能修改地址的内容) #include int main() { const char* p = "apple";//创建一个常量指针 p = "orange"; printf("%s\n", p); }

13120

【说站】c语言void*指针是什么

c语言void*指针是什么 1、void*指针指针,也指向内存中某个地址的数据,但是内存中的数据类型是不确定的,所以使用时需要转换类型。...2、void的意思是无类型,是无类型指针,可以指向任何类型的数据。 因此void指针通常被称为通用指针或泛指针,或万能指针。...实例 #include   int main(void) {     int num1 = 1;     char char1 = 'b';       /*定义两个void指针类型*.../     void *void_pointer_1;     void *void_pointer_2;       /*给不同的void指针指向不同的数据类型*/     void_pointer_...    voidvoid_float_pointer ;     /**将float类型指针赋值给void类型指针*/     void_float_pointer = float_pointer;

1.1K30

数组指针指针数组

一、数组指针 初学C语言的朋友对数组指针指针数组感到迷惑,分不清,包括我自己,其实是对概念的不清晰以及对数组指针这两个概念理解的不够深入,下面谈谈我的理解。...元素类型为int,元素个数为10 A* p = NULL;//p是数组指针类型变量 int a[5] = {0}; p = &a;//注意,不能写成 p=a,两者类型是不相同的 //a代表数组首元素的地址...是数组指针变量 二、指针数组 指针数组,是一个数组,而不是指针。...,这个指针指向.rodata对应的常量字符串 指针数组的应用 完整的main函数原型,int main(int arc,char* argv[],char* envp[]) 其中,两个数组分别保存命令行参数环境变量...如果进行了检查当数组数据量非常大时候会显著减低程序的效率,在安全性高效率之间,权衡利弊之下。

73610

关于变量、指针、别名(引用)指针指针

C/C++中的指针别名这个东西确实是够恶心的。...今天蛋疼的就写一下这些东西的区别,变量永远是最简单的没有什么技术含量,那么另外一个比较简单的就是别名了,其实个人感觉这个东西完全可以看作是一个人的“小名”,只是对同一个变量多了一个称呼而已,指向的数据地址是原变量完全一致的...,并且用&进行取地址操作的得到的地址原变量的地址是完全一致的(因而在对指针进行赋值的时候如果直接对指针地址操作则需要对变量或者别名使用&进行取地址运算,如果要直接赋值则需要使用*p=进行赋值)。...; //指针 int *ppiB=NULL; //指针 int **ppi=NULL; //指针指针 int &nameA=ivalA; //别名 int &nameB...cout< <"变量、别名、指针指针指针的关系:"<

1.3K30

详解 常量指针指针常量

说一下 常量指针指针常量 的区别。 常量指针   指向常量的指针,也就是说指针指向的对象是常量,指向的常量不能修改。指针不是一个常量, 可以把指针指向别一个常量。...常量指针是我们最常用的,一般声明形式如下: const int *p; int const *p; 例: int a(1), b(3); const int *...不可以对指向的内容做修改: *p = 3; // 错误 指针常量   指针指向的地址不可以改变,地址的内容可以通过指针改变。指针常量在定义时必须赋值。...不能对指向的地址进行修改: p = &b; // 错误 我们也可以这样记 const 在谁前边谁就不可以修改: 常量指针 : const 在指针前边,我们就不可以修改指针。...指针常量 : const 在变量前边,我们就不可以修改指针的地址。

1.2K70

C++里引用指针到底什么区别

那么问题来了,引用指针什么区别呢? 关于指针引用的区别,往深了讲又可以单独写一篇文章了,为了防止大家一下子记不住,我们今天不聊那么深入,只谈谈原理上的区别。 其实很简单,引用可以理解成别名。...那么引用指针什么区别呢? 其实很简单,指针是附加的属性,是一种绑定关系。引用则就是一个账号的别名,就好比我们用手机号绑定账号,我们可以用手机号登陆操作账号。...可能有人会觉得奇怪,int a = 3; int &b = a;这样写int a = b = 3;什么区别?难道不都是等于3吗?...再比如自增运算,指针的自增运算引用也是不同的。因为指针的自增默认是内存地址+1,也就是移动指针指向的内存位置。而引用的自增运算也就是变量的自增运算。...关于指针引用还有很多很多要说,想要成为代码大牛,对于引用指针的理解是必不可少的。今天的文章只是一个开胃菜,后面的内容更加精彩。

23220

【C语言】深入理解NULL指针

什么是NULL? 在 C 语言中,NULL 是一个宏,用于表示空指针。它是一个特殊的值,通常用于初始化指针、比较指针是否为空等操作。...在 C 语言标准库中,NULL 的具体值可以是 0 或者 (void *)0,具体取决于编译器和平台。...用途功能 1、初始化指针 在 C 语言中,初始化指针时经常使用 NULL,例如: int *ptr = NULL; 2、比较指针是否为空 在进行指针操作时,通常需要判断指针是否为空,可以使用 NULL...理解熟练使用 NULL 可以帮助我们编写更加健壮可靠的 C 语言程序。希望本篇博客能够帮助你更好地理解 NULL 的用途功能,并在日后的编程工作中能够更加熟练地运用它。...如果你任何关于 C 语言或者其他编程相关的问题,都可以随时留言交流。感谢阅读!

14010

详解c++指针指针指针的引用

展示一下使用指针指针指针的引用修改传递给方法的指针,以便更好的使用它。...(这里说的指针指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针指针的值传递。...我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } int main(int argc, char *argv...输出的是两个2 使用指针指针 展示一下使用指针指针做为参数 void func(int **p) { *p = &m_value; // 也可以根据你的需求分配内存 *p...换句话说,我们修改的是main()方法里 *pn指针 **p: 两次解引用是指向main()方法里*pn的内容 指针的引用 再看一下指针的引用代码 int m_value = 1; void func

1.3K60
领券