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

C中的函数指针:警告:来自不兼容指针类型的赋值[-Wincompatible- pointer -types]

C中的函数指针是指可以指向函数的指针变量。它可以用来在程序运行时动态地选择调用不同的函数,从而实现灵活的函数调用机制。函数指针的类型与所指向的函数的返回值类型和参数类型相匹配。

函数指针的定义方式如下:

代码语言:txt
复制
返回值类型 (*指针变量名)(参数列表);

函数指针的赋值可以通过直接赋值给指针变量,或者通过取函数名的方式进行赋值。

函数指针的优势在于可以实现回调函数、动态函数调用和函数的动态绑定。它可以在运行时根据需要选择不同的函数进行调用,提高程序的灵活性和可扩展性。

函数指针的应用场景包括但不限于:

  1. 回调函数:将函数指针作为参数传递给其他函数,用于在特定事件发生时调用。
  2. 排序算法:通过函数指针指定不同的比较函数,实现不同的排序方式。
  3. 动态库加载:通过函数指针调用动态库中的函数,实现动态加载和调用。
  4. 状态机:通过函数指针实现状态机的状态转换和动作执行。

腾讯云提供的相关产品和服务中,与函数指针相关的内容主要涉及云原生、人工智能和移动开发等领域。以下是一些相关产品和服务的介绍链接:

  1. 云原生:腾讯云原生应用引擎(Tencent Cloud Native Application Engine,TKE)是一种高度可扩展的容器化应用管理平台,支持使用函数计算(Serverless)模式进行应用开发和部署。了解更多:腾讯云原生应用引擎(TKE)
  2. 人工智能:腾讯云人工智能开放平台(AI Open Platform)提供了丰富的人工智能能力和服务,包括自然语言处理、图像识别、语音识别等。这些能力可以通过函数指针进行灵活调用和集成。了解更多:腾讯云人工智能开放平台
  3. 移动开发:腾讯云移动开发平台(Tencent Cloud Mobile Development Platform)提供了一站式的移动应用开发解决方案,包括移动后端云服务、移动应用测试和分析等。函数指针可以用于实现移动应用中的动态函数调用和回调机制。了解更多:腾讯云移动开发平台

请注意,以上链接仅供参考,具体的产品和服务选择应根据实际需求进行评估和决策。

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

相关·内容

C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 值 | 在函数 间接修改 指针变量 值 | 在函数 间接修改 外部变量 原理 )

文章目录 一、直接修改 和 间接修改 指针变量 值 二、在函数 间接修改 指针变量 值 三、在函数 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 值 ---- 直接修改 指针变量...值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 将变量地址赋值指针变量 , 或者使用 malloc 函数分配内存赋值指针变量 ; // 将变量地址赋值给一级指针 p...return 0; } 执行结果 : 二、在函数 间接修改 指针变量 值 ---- 在 函数 间接修改 指针变量 值 , 将 指向一级指针 二级指针 变量 , 传递到 函数形参 ,...在 函数 , 使用 * 符号 , 修改 二级指针 指向 一级指针 变量值 ; 注意 : 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量...n", p); // 在函数 , 简介修改指针值 modify_pointer(p2); // 打印一级指针地址 printf("%d\n", p);

21.2K11

objective-CClass(类类型),Selector(选择器SEL),函数指针(IMP)

今天在园子里看到了一篇牛文“Objective-C 2.0 with Cocoa Foundation--- 5,Class类型,选择器Selector以及函数指针 ”,讲得十分精彩,忍不住把它代码加上注释整理于此...个人体会:obj-C“Class类型变量”比c#Object基类还要灵活,可以用它生成任何类型实例(但是它又不是NSObject)。...而选择器SEL与函数指针IMP,如果非要跟c#扯上关系的话,这二个结合起来,就点类似c#反射+委托,可以根据一个方法名称字符串,直接调用方法。...(传统C语言处理方式) void(*setSkinColor_Func)(id,SEL,NSString*); //定义一个IMP方式函数指针(obj-C推荐方式) IMP say_Func...say_Func = [cattle[1] methodForSelector:say]; //用函数指针形式调用setSkinColor setSkinColor_Func(cattle

1.8K51
  • C语言边角料:结构体中指针类型成员变量,它类型重要吗?

    本着强迫症要消灭一切警告做法,最终定位到:是结构体内部, 指向结构体类型指针成员变量导致问题。 这个问题,也许永远不会碰到,之所以被我赶上了,应该是因为某个时候手贱, 误碰了键盘导致。...然后 gcc 在解析 Data2 d2 = {2, &d1}; 这一行时,就发现 类型匹配了:data2 next 需要是 struct _Data3_ 类型指针,但是赋值 d1 是 struct..._Data1_ 类型,于是给出警告信息。...三、把类型改为 void 指针类型 把 struct _Data2_ next 成员,改为 指向 void 型指针,然后在 main 函数操作它。...然后把这个地址赋值给dn 指针,那么通过dn指针来操作该地址内成员时,就取决于在定义dn时所指定数据类型(Data1),因此 dn->a 就可以正确从这个地址取出前 4 个字节,然后作为一个int

    53640

    C++核心准则ES.48:避免使用类型转换

    类型转换在系统级编程是必要。例如,不然我们怎么获得登录到指针派生类类型设备?然而,类型转换已经被严重地过度使用,从而变成了错误主要来源之一。...译者注: [[nodiscard]]是C++17引入新特性,如果调用了返回值声明为[[nodiscard]]运算而没有处理返回值,C++17鼓励编译器发布警告。..., safe, implicit conversions between pointer types 依靠指针类型之间经过良好定义,安全,显式类型转换。...强制消除C风格类型转换,除了将[[nodiscard]]函数返回值转换为void之外。...如果目的类型和源类型相同,针对指针类型之间身份转换发布警告。 Warn if a pointer cast could be implicit. 如果指针类型转换可能会隐式发生,发布警告

    63820

    clang_intprt_t类型探究

    return 0; } 只看op == LC这段代码,ax是一个int类型,存放值是char *指针类型地址,取完该地址所在值再赋给变量ax 但是如此写代码,vimyoucomplete插件一直报错...我们探讨一下原因,32位和64int类型都是4个字节,但是指针类型大小不一致 #include int main() { int *p; printf("the...[rbp-0xc]处 139行,将地址传给了rax寄存器,注意rax是16字节(对应题目中指针大小),对应下图2行,rax存储就是(A,B) 140行,对应下图3行指令eax是rax低位,存储值就是...eax表达出来是负数,rax高位补出来是全f;同理eax正数情况下,rax高位补全才是0 解决方案 在c99标准库里面有一个结构体,intptr_t可以实现编译器位数兼容性 //头文件stdint.h...‘X*’ to ‘Y’ loses precision” a hard error and what is suitable fix for legacy code C语言指针转换为intptr_t类型

    1.1K100

    【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    Institute 美国国家标准学会, 即标准C; -- 通用指针类型 : ANSI C中使用 void* 作为通用指针类型, 即指向void指针, void 是空类型, void* 是空类型指针,...默认返回值 : C , 如果没有标明返回值类型, 默认返回值不是 void, 是 int 类型; -- void参数 : C 语言中参数是void, 传入参数不会出错, C++传入参数会出错,...因此这里我们统一规定, 如果函数没有参数, 就定义为void; . (2) void*简介 void * 作用 :  -- 通用数据类型 : void * 指针可以存放任意类型数据地址, 任何数据类型指针都可以赋值给...: 标准C 规定 void * 类型不允许进行 加减乘除 算数运算, 因为我们不知道这个类型大小, GUN void * 等价于 char * ; 2....for built-in function ‘strlen’, 原因是 C语言中已经有了 strlen 函数了, 如果改一个函数名, 就不会有这个警告了; [root@ip28 pointer]#

    3.9K20

    Effective C++: 改善程序与设计55个具体做法

    条款11:在operator=处理“自我赋值” 请记住 ■ 确保当对象自我赋值时operator=有良好行为。...你应该在你所有接口中努力达成这些性质。 ■ “促进正确使用”办法包括接口一致性,以及与内置类型行为兼容。...条款25:考虑写出一个抛异常swap函数 请记住 ■ 当std::swap对你类型效率不高时,提供一个swap成员函数,并确定这个函数抛出异常。...■ 因类型参数(type parameters)而造成代码膨胀,往往可降低,做法是让带有完全相同二进制表述(binary representations)具现类型(instantiation types...条款45:运用成员函数模板接受所有兼容类型 请记住 ■ 请使用member function templates(成员函数模板)生成“可接受所有兼容类型函数

    70820

    c语言基础学习07_指针

    、取地址运算符 &、无类型指针指针占用内存说明、野指针 与 空指针、空指针理解扩展、指针兼容性(即指针类型之间一定要匹配)、 不同数据类型在内存占用地址、指向常量指针指针常量、指针与数组关系...即指针类型兼容。那么我们强转试试!...============= 指针兼容性(即指针类型之间一定要匹配) 指针之间赋值比普通数据类型赋值检查更为严格,例如:不可以把一个 double * 赋值给int。...8 9 return 0; 10 } 警告如下: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types...] 警告兼容指针类型分配[-Wincompatible-pointer-types] =======================================================

    1.5K10

    C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象...子类对象 , 父类指针 值为 子类对象 在 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型引用 ; 二...或 父类引用 , 此处可以直接传入 子类指针 或 子类引用 ; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer(Parent* obj) { obj...{ cout << "子类 funChild 函数" << endl; } }; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer...child.funParent(); // 将指向子类对象指针传给接收父类指针函数 // 也是可以 fun_pointer(&child); // 接收父类引用

    28320

    C++四种类型转换以及const_cast是否能改变常量问题

    +四种类型转换总结如下: const_cast(expr) 用来移除对象常量性(cast away the constness) const_cast一般用于指针或者引用 使用...编译器隐式执行任何类型转换都可以由static_cast完成 当一个较大算术类型赋值给较小类型时,可以用static_cast进行强制转换。...可以将void*指针转换为某一类型指针 可以将基类指针强制转换为派生类指针,但是不安全。...如果你遇到不能将整型转变为函数指针问题,你可以这样解决: reinterpret_cast(nAddress); 注意LPFUN这里有个“&”符号,表示引用,C++引用其实就是用指针实现...记住,只有当const限定符加在已经初始化全局变量前面的时候,此时变量处在.rodata段(linux下),才是真正不可修改,否则通过指针都是可以修改,虽然编译过程中会产生警告

    1.4K100

    C++】继承 ⑥ ( 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象...子类对象 , 父类指针 值为 子类对象 在 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型引用 ; 二...或 父类引用 , 此处可以直接传入 子类指针 或 子类引用 ; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer(Parent* obj) { obj...{ cout << "子类 funChild 函数" << endl; } }; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer...child.funParent(); // 将指向子类对象指针传给接收父类指针函数 // 也是可以 fun_pointer(&child); // 接收父类引用

    30500

    你该知道C++四种显式类型转换

    这个检查主要来自函数(virtual function) 在C++面对对象思想,虚函数起到了很关键作用,当一个类拥有至少一个虚函数,那么编译器就会构建出一个虚函数表(virtual method...a pointer to a function of a different type (从指向函数指针转向另一个不同类型指向函数指针) A pointer to an object to a...pointer to an object of a different type (从一个指向对象指针转向另一个不同类型指向对象指针) A pointer to a member to a pointer...types (从一个指向成员指针转向另一个指向类成员指针!...或者是类型,如果类型成员和函数都是函数类型或者对象类型) 下面这个例子来自 MSDN 一个哈希函数辅助 // expre_reinterpret_cast_Operator.cpp // compile

    1.9K20

    听GPT 讲Go源代码--types.go

    同样将该地址转换为unsafe.Pointer类型。 利用Go语言多重赋值机制,交换两个元素值。...这个函数主要是由内部库和编译器使用建议在用户代码中直接使用。...Store Store函数是用来把一个值存储到指定内存地址。它作用相当于C语言中指针赋值。 该函数接收两个参数:一个是存储地址,另一个是要存储值。...storePointer函数就是用来更新指针。 该函数将一个指针类型地址和该指针指向对象指针一起传递做参数,并将该指针指向新对象指针赋值给原先传递进来指针类型地址。...由于GC需要追踪所有指针,因此对指针修改必须是原子,并且不能写入缓存。如果遵守这些原则,就会使GC找不到所有的指针对象,从而导致内存泄漏。

    26540

    【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

    函数指针指针函数 (1) 指针函数 概念 : 函数返回结果是一个地址, 即返回是一个指针, 这个函数就是指针函数; 指针函数格式 : 类型说明符 *函数名(参数列表); -- 示例 : char..., 数组元素师字符串, 即char类型指针 char *lineptr[MAXLINES]; /* * 声明函数指针 */ int (*p_get_line)(char *, int); int...将 指向函数指针指针 类型改为 char*, *(char)&p 就是 取出转换类型函数指针, 这个是已经转换好类型函数指针; -- (char)fun : 将fun函数 函数指针转换为 char...类型, 函数入口地址转换为 char 类型; -- *(char*)&p = (char)fun : 指的是将函数地址 赋值指针变量p; -- (*p)() : 调用这个 指针 指向函数;...)())[5] : 数组元素是 char 类型; 5.

    61530

    Go里面的unsafe包详解

    来自go语言官方文档警告 unsafe包文档是这么说: 导入unsafe软件包可能不可移植,并且不受Go 1兼容性指南保护。...让我们阅读unsafe包文档列出规则: 任何类型指针值都可以转换为unsafe.Pointer。 unsafe.Pointer可以转换为任何类型指针值。...这些规则与Go规范一致: 底层类型uintptr任何指针或值都可以转换为指针类型,反之亦然。 规则表明unsafe.Pointer类似于c语言中void 。当然,void 在C语言里是危险!...,已经确认: 在unsafe包函数签名将不会在以后Go版本更改, 并且unsafe.Pointer类型将在以后Go版本始终存在。...所以,unsafe包三个函数看起来危险。 go team leader甚至想把它们放在别的地方。 unsafe包这几个函数唯一不安全是它们调用结果可能在后来版本返回不同值。

    1.1K40

    SWIG 官方文档第四部分 - 机翻中文人肉修正

    [0] = &ffi_type_pointer; values[0] = &arg1; /* Set up first argument */ types[1] = &ffi_type_pointer...例如,重载赋值运算符映射到 Lua 语义,将被忽略,C++ 不支持 Lua 连接运算符 ( .. )。...根据 C 标准,来自 C 结构枚举被导出到周围作用域,没有任何前缀。...28.4.4 类型映射和指针指针函数 几个 C++ 库使用指针指针函数来创建其对象。这些函数需要一个指向指针指针,然后用指向新对象指针填充该指针。...它获取 Lua 状态给定索引处值并将其转换为用户数据。然后它将提供必要类型检查,确认指针与“type”给出类型兼容。然后最后将 '*ptr' 设置为指针

    5.3K40

    【嵌入式开发】C语言 指针数组 多维数组

    内存分配原理 : 设置一个大数组, 内存分配就分配这个数组空间, alloc 和 afree 函数操作指针, 不是数组, 因此这个数组可以隐藏, 将数组定义为static 类型, 那么在其它文件...alloc_buf, 将char数组首地址赋值给char类型指针; -- 初始化内容 : 0 或者 地址; -- 地址限定 : 对指针初始化地址, 该地址存储数据类型必须是该指针类型;  内存可用判断.../a.out length = 10 指针差值类型 :  -- ptrdiff_t : 该类型定义在 stddef.h 头文件, 表示两个指针之间带符号差值; -- size_t : 该类型定义在...++ 下一个元素都指向下一个 同类型元素; 指针之间有效运算 : 除下面几种合法运算之外, 其它运算都是非法, 但不会报错, 会警告; -- 赋值 : 同类型指针之间赋值运算; -- 算数 :...int 类型 * 将int 类型数据 赋值给 char 类型, 就是截取 int 最后8位 即一字节赋给char变量 * * 循环条件 : * 输入字符数超过 定义 MAXLEN

    94360
    领券