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

“void*”和“void* (* function )(void *)”初始化、强制转换和函数指针调用之间的区别?

void是C语言中的一种特殊类型,表示一个指向未知类型的指针。它可以用来存储任意类型的指针,但不能直接解引用或进行算术运算。void通常用于在函数之间传递指针,而不需要关心具体的数据类型。

void* (* function )(void )是一个函数指针,它指向一个参数为void类型,返回值为void*类型的函数。这种函数指针可以用来调用具有不同参数和返回值类型的函数。

区别:

  1. 初始化:void可以直接赋值为任意类型的指针,而void (* function )(void *)需要通过函数指针的类型来初始化,即指向具有相同参数和返回值类型的函数。
  2. 强制转换:void可以通过强制类型转换将其转换为其他类型的指针,而void (* function )(void *)不能直接进行强制类型转换,因为它是一个函数指针类型。
  3. 函数指针调用:void不能直接调用函数,需要先将其转换为具体类型的指针,然后才能调用函数。而void (* function )(void *)可以直接通过函数指针调用函数,无需进行类型转换。

总结: void是一个指向未知类型的指针,用于在函数之间传递指针,而void (* function )(void *)是一个函数指针,用于指向具有相同参数和返回值类型的函数,并可以直接调用函数。

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

相关·内容

  • void 在 JS 和 TS 中的区别

    // 每日前端夜话 第588 篇 // 正文共 1200 字 // 预计阅读时间:7 分钟 如果你用过传统的强类型语言,可能会很熟悉 void 的概念:一种类型,告诉你函数和方法在调用时不返回任何内容...其次,这是一种调用立即调用函数的好方法: void function() { console.log('What') }() 所有这些都没有污染全局命名空间: void function aRecursion...总是返回 undefined,而 void 总是计算它旁边的表达式,你有一个非常简洁的方法从函数返回而不返回一个值,但仍然调用一个回调例如: // 返回除 undefined 以外的其他内容会使程序崩溃...function iHaveNoReturnValue(i: number): void void 作为类型也可以用于参数和所有其他声明。...如果你想确保传递只返回 undefined 的函数(如“nothing”),请确保调整你的回调方法签名: - function doSomething(callback: () => void) { +

    4K20

    一文看懂any,never,void和unknown的区别

    如果你也有同样的困惑,那么就请跟着本篇文章彻底搞懂这四种类型的区别吧。...这里值得一提的是any只能作为临时过渡方案,我们最后的结果一定是确保代码尽可能少any的出现 我们不关心对象的类型:例如我们实现了一个print函数,这个函数底层调用console.log,这个时候其实我们不需要关心传进来的具体数据类型是什么...void void其实可以理解为null和undefined的联合类型,它表示空值。...void一个更加常见的使用场景是表示某个函数没有任何返回值: function noReturnValue(): void { console.log('hello') // 代码没有任何返回值...,所以这个函数的返回值是void } 使用场景 这里只想说明一下void和never的区别。

    94230

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

    指针所指向的内存区: 在函数调用时就会创建一个栈桢,在栈桢中内存被划分为一个一个的单元, 其中每个内存单元能存放8个比特位(一个字节),每个单元也有一个编号。...), 但是硬件和硬件之间相互独立,故用"线"连接起来(物理上的), 而CPU和内存之间也有大量的数据交互,所以两者也用线连接起来。...*指针:无具体指针(泛型指针) 这种类型的指针可以用来接受任意类型的地址,但也有局限性, void*类型的指针,局限性在于他不能直接进行指针的+-整数和解引用的运算 有什么用: 一般void...*类型的指针是使用在函数参数的部分,用来接收不同数据类型的地址, 这样可以实现泛型编程的效果,使得一个函数来处理多种类型的数据 注意: void*类型的指针不能直接进行解引用的操作 void...指针未初始化 2.指针越界访问造成野指针 3.指针指向的空间释放 1.

    19910

    .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException

    .equal()和==的区别 ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较...==指引用是否相同, equals()指的是值是否相同 在java中数值相同是指向同一内存地址的; 怎样判断字符串为空问题: 直接上代码 TextUtils.isEmpty(searchContent...) Illegal invoke-super to void Illegal invoke-super to void javax.swing.JComponent.setFont(java.awt.Font...) from class org.apache.log4j.lf5.viewer.LogTable 上面这个错误是:在LogTable中的setFont调用非法; 我实在打包的时候出现的错误,这就是混淆的问题了

    5810

    c和c++的区别 (一)函数默认值、内联函数、函数的重载和cc++之间的相互调用

    一.函数默认值 c++支持给函数的形式参数进行默认初始化,其规则为从右向左依此初始化。 还有以下需要注意的几点: 1.定义处可以不给出形参的默认值,在声明处可以给出形参的默认值。...因为递归函数调用的次数只有在执行完毕才能确定,而内联函数的处理实在编译阶段根据上述规则进行处理的。而递归函数没有给编译器提供这样的规则。 内联函数和宏函数的区别?...内联函数和static函数的区别?...3.不能以返回值不同作为判断重载的条件,因为返回值类型符符号的生成无关。 4.对实参的值是否有影响,如被const/volatile修饰的*(指针)/&(引用)可以作为函数重载的前提条件。...四.c和c++之间相互调用 在实际的应用当中,有时候会发生这样的事情,c程序可能需要调用一些优秀的c++程序的接口,而在c++程序中也可能需要调用优秀的c程序接口,这样就需要提供这样相互调用机制

    71410

    CC++函数指针与指针函数

    函数指针的赋值 函数指针和其他指针一样定义之后使用之前也是需要初始化。...这个函数没有参数,没有返回值。 第二步:通过(void(*) ())0,可以明白这是将0强制转换为函数指针类型,0是一个地址,也就是说一个函数存在首地址为0的一段区域内。...让程序跳转到绝对地址为0x0113F90C 方法一: 将0x0113F90C地址强制转换为函数指针类型,即: (void (*)())0x0113F90C 然后调用:((void (*)())0x0113F90C...* 类型,在调用的时候强制转换返回值为自己想要的类型。...其输出结果是一样的,不过不建议这么使用,因为强制转换可能会带来风险。返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。

    94410

    c++之内存分配、命名空间、强制类型转换学习总结

    : 1、static_cast强制类型转换: 用于基本类型之间的转换 不能用于基本类型指针之间的转换 用于有继承关系类对象之间的转换和类指针之间的的转换 代码解析: #include ...不能用在基本类型指针之间进行强制转换。...2、const_cast强制类型转换: 用于去除变量的只读属性 强制类型转换的目标类型必须是指针或者引用 代码解析: #include void const_cast_demo()...3、reinterpret_cast强制类型转换: 用于指针类型之间的强制转换 用于整数和指针类型之间的强制转换 代码解析: #include void reinterpret_cast_demo...4、dynamic_cast强制类型转换(暂时有些概念没有学到,先记住结论): 用于有继承关系的类指针之间的转换 用于有交叉关系的类指针之间的转换 具有类型检查的功能 需要虚函数的支持 代码分析: #include

    55930

    《逆袭进大厂》之C++篇49问49答

    3、指针和引用的区别 指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向...malloc和free返回的是void类型指针(必须进行类型转换),new和delete返回的是具体类型指针。 delete和delete[]区别? delete只会调用一次析构函数。.../whlook/p/6501918.html 28、拷贝初始化和直接初始化 当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数...当拷贝构造函数为private时:语句3和语句4在编译时会报错 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错 C++的直接初始化与复制初始化的区别:https://blog.csdn.net...第一个例子用到了空类型指针void*,第二个例子则是在两个类型指针之间进行强制转换。因此,想保证程序的类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指针做强制转换。

    2K10

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    3、指针和引用的区别 指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向...malloc和free返回的是void类型指针(必须进行类型转换),new和delete返回的是具体类型指针。 delete和delete[]区别? delete只会调用一次析构函数。.../whlook/p/6501918.html 28、拷贝初始化和直接初始化 当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数...当拷贝构造函数为private时:语句3和语句4在编译时会报错 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错 C++的直接初始化与复制初始化的区别:https://blog.csdn.net...第一个例子用到了空类型指针void*,第二个例子则是在两个类型指针之间进行强制转换。因此,想保证程序的类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指针做强制转换。

    2.6K40

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    在该函数前添加extern “C”声明。由于编译后的名字不同,C++程序不能直接调用C 函数。 4、指针和引用的区别是什么?...,malloc返回void*指针,需要强制类型转换 new可以被重载,malloc不能 10、new和delete是如何实现的?...使用命名的强制类型转换函数const_cast时,只能改变运算对象的底层const。...当拷贝构造函数为private时:语句3和语句4在编译时会报错。 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错。 31、初始化和赋值的区别?...: 重写是父类和子类之间的垂直关系,重载是不同函数之间的水平关系 重写要求参数列表相同,重载则要求参数列表不同,返回值不要求 重写关系中,调用方法根据对象类型决定,重载根据调用时实参表与形参表的对应关系来选择函数体

    2.2K20

    CC++面试题之语言基础篇(一)

    new 返回的是指针,不需要进行类型转换;malloc 返回的是void *(无类型指针)。...需要手动将其转换为适当的类型 new 会调用构造函数来初始化对象(如果是自定义类的对象),而 malloc 不会执行构造函数。 void * void * 是通用指针类型,被称为"无类型指针"。...使用 void * 指针时需要谨慎,必须进行类型转换 示例(int 型转换): int * intPtr=static_case(ptr); 因为不提供类型检查,可能导致运行时类型错误。...,会影响实参的值; void baz(int *x) { *x = *x * 2; // 修改原始数据 } 堆和栈的区别 C++ 有几种构造函数 默认构造函数:默认构造函数没有参数,它用于创建对象的默认初始化...// 处理右值引用 } std::move 是什么 std::move用于将左值强制转换为右值引用,然后原来的x变成空串。

    30910

    真没想到nullptr和NULL得区别,大了去了

    第3章 转向现代C++ 条款7:在创建对象时注意区分()和{} //创建对象时候注意区分 () 和 {} //指定初始化的方式有:小括号,等号,大括号 //情况1:内建型别来说 int 初始化和赋值没有区别...int x(1); int y = 2; int z{3}; int zz = {4};//等号+{}也是可以的 //对于用户定义的型别 初始化和赋值区别大了 //对于用户定义的型别 初始化和赋值区别大了.../不可行 //结论:可见 {} 初始化的方式比较统一,但是注意它有一项新特性: //禁止内建型别之间进行隐式型别转换,如果大括号内的表达式无法保证能够采用进行初始化的对象来表达,则代码不能通过编译 double...//区别一:处理函数指针的理解性 //区别一:处理函数指针的理解性 //FP的型别是一个指涉到函数的指针,该函数形参包括一个 int 和一个 const std::string&, 没有返回值 typedef...//1,void*指针,无法对其进行自增,自减得操作 //2,char* 指针表示得式C风格得字符串,不是指涉到单个字符得指针 //假定采用这两个型别时拒绝调用,不可以使用 void* 和 char*

    1.8K30

    c++系列之二 指向成员函数的指针(烧脑)

    *fptr) 和 (p->*fptr) 两边的括号是语法所强制要求的。 成员函数指针不是常规指针 成员函数指针不像常规指针那样保存某个“准确”的地址。...但是,如果是成员函数指针之间相互转换呢?...,所以即使进行强制转换,依然调用的是Foo类的f()函数)。...结论 简单总结一下,通过上述文章,我们学到了: 成员函数指针声明和定义的语法 使用成员指针选择操作符来调用成员函数的语法 使用 typedef 写出更加清晰的代码 非虚成员函数、虚函数、静态成员函数之间的区别...成员函数指针和常规指针的对比 不同情形下的成员函数指针转换规则 如何使用成员函数指针数组来解决特定的设计问题 编译器是如何解释成员函数调用的 扩展:成员变量指针 http://luodw.cc/2015

    3.1K20

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

    = NULL) 4 结构体可以直接赋值吗 声明时可以直接初始化,同一结构体的不同对象之间也可以直接赋值,但是当结构体中含有指针“成员”时一定要小心。...21 指针常量与常量指针区别 指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。...无论在什么平台地址长度和整型数据的长度是一样的, 即一个整型数据可以强制转换成地址指针类型,只要有意义即可。...26 简述指针常量与常量指针的区别 指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。...「注意」:无论是指针常量还是常量指针,其最大的用途就是作为函数的形式参数,保证实参在被调用函数中的不可改变特性。 27 如何避免“野指针” 指针变量声明时没有被初始化。

    3.1K01

    基础知识_Cpp

    实现一个shared_ptr智能指针 4.5. shared_ptr的线程安全性 4.6. C++11的四种强制类型转换 4.7. 列表初始化 4.8. decltype作用以及与auto区别。...虚函数是实现运行时多态的一种机制,比如两个父类指针分别指向子类A和子类B的实例,父类指针调用虚函数时,会根据不同的子类来调用不同的函数。...指针和引用的区别 指针也是一个变量,里面存储的内容是一个地址。而引用本质上是一个常量指针,引用只允许初始化,不能再修改。 编译指针和引用的代码,在汇编上是一样的:c++中,引用和指针的区别是什么?...参数是要分配的字节数,返回void*类型的指针,返回值一般需要强制类型转换才能使用。 如果申请内存失败会返回NULL。 可以用realloc扩容,使用free释放内存。...隐式转换都建议使用 static_cast 进行标明和替换。 在有类型指针与void *之间转换,不能使用static_cast在有类型指针间转换。 // 1.

    2K30

    C语言中void具体有什么作用

    众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型 转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。...*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换: void *p1; int *p2; p1 = p2; 但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针...规则二如果函数无参数,那么应声明其参数为void 在C++语言中声明一个这样的函数: int function(void) { return 1; } 则进行下面的调用是不合法的...: function(2); 因为在C++中,函数参数为void的意思是这个函数不接受任何参数。...规则四如果函数的参数可以是任意类型指针,那么应声明其参数为void * 典型的如内存操作函数memcpy和memset的函数原型分别为: void * memcpy(void *dest,

    2K20

    又在函数指针上面犯错了

    因此为了告诉编译器代码这里没有问题,程序员可以使用强制类型转换来将一段内存转换为需要的数据类型,例如下面有一个数组a,现在将其强制转换为一个结构体类型stu: #include typedef...函数指针的调用如下: 为了确认函数指针本质上是传递给call指令一个函数的地址,下面用一个简单例子说明: 上面是编译后的汇编指令,可以看到,使用函数指针来调用函数时,其汇编指令多了如下: 0x4015e3...最常见的是file_operations结构体,该结构体一般来说只需要初始化常见的函数,不需要全部初始化。...); return 0; } 上面的代码中TaskA_CallBack是回调函数,该函数的形参为一个函数指针,而FFT_Function是一个被调用函数。...可以看到回调函数中申明的函数指针必须和被调用函数的类型完全相同。

    11710
    领券