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

为什么不能将函数赋值给函数指针?

函数指针是指向函数的指针变量,它存储了函数的地址。函数赋值给函数指针是不允许的,因为函数和函数指针在内存中的存储方式不同。

函数在内存中是以代码的形式存在的,它们被编译成机器指令并存储在代码段中。而函数指针是一个变量,它存储的是函数的地址,即代码段中函数的起始位置。

由于函数和函数指针在内存中的存储方式不同,所以不能直接将函数赋值给函数指针。这是因为函数的地址是由编译器在编译时确定的,而函数指针的类型是在声明时确定的。如果将函数赋值给函数指针,会导致类型不匹配的错误。

另外,函数指针还可以用来实现回调函数和动态调用函数等功能。通过将函数的地址赋值给函数指针,可以在程序运行时动态地调用不同的函数。

总结起来,不能将函数赋值给函数指针是因为函数和函数指针在内存中的存储方式不同,类型不匹配。

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

相关·内容

【C++】函数重载 ③ ( 为函数指针赋值重载函数 )

int 类型 ; int (*p)(int, int); 3、代码示例 - 函数指针示例 定义 int (*)(int, int) 类型的函数指针 , 将如下函数赋值函数指针 int add(int...a, int b) { return a + b; } 可以将 add 直接赋值函数指针 , 也可以先使用 & 符号获取 函数地址 &add , 然后再赋值函数指针 ; // 定义 函数指针..., 将函数地址赋值 函数指针 int (*func_ptr)(int, int) = add; int (*func_ptr2)(int, int) = &add; 上述两种赋值都是正确的 , 通过...二、为函数指针赋值重载函数 ---- 1、为函数指针赋值重载函数函数指针 进行赋值时 , 直接将 函数赋值函数指针 ; 如 下面的代码中 , 直接将 add 函数赋值函数指针 func_ptr...int main() { // 定义 函数指针 , 将函数地址赋值 函数指针 // 对函数指针进行赋值时 , 会根据函数指针的类型匹配 add 函数 // 显然会匹配到 int add(int

22910

【C 语言】指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )

文章目录 一、指针作为 函数参数 ( 间接赋值 ) 的意义 二、间接赋值 代码示例 一、指针作为 函数参数 ( 间接赋值 ) 的意义 ---- 调用函数时 , 调用 & 取地址 生成 实参 p , 将...指针变量 p 实参 传递给 函数形参 , 在函数中 借助传入的 指针 可以 实现 与 外部函数 的内存共享 , 在函数中使用 *p 修改内存值 , 可以将 运算结果通过 *p 传递出来 ; 指针 作为...函数参数 , 可以实现 主函数 与 被调用子函数 之间 内存交换 ; 下面是逻辑链 : 指针函数参数 ( 间接赋值 ) -> 接口封装与设计 -> 模块划分 -> 软件分层 正是因为有了 间接赋值 ,...进行处理 , 这些修改 , 可以保留到函数值返回之后 , 这些参数都可以作为返回值使用 ; 使用 指针 ( 一级指针 或 多级指针 ) 作为参数 , 实现了 main 函数 , 与 其它 子函数 之间的...解耦操作 , 实现了 模块化开发 ; 如果没有 指针 作为函数 , 就无法实现 功能分层 , 无法实现 模块化开发 , 就无法实现 接口 封装 与 设计 ; 二、间接赋值 代码示例 ---- 代码示例

1.1K10

【C 语言】指针间接赋值 ( 直接赋值 和 间接赋值 | 在子函数中间接赋值 )

文章目录 一、直接赋值 和 间接赋值 二、在子函数中间接赋值 一、直接赋值 和 间接赋值 ---- 在 函数体 内部 , 声明普通变量 , 直接赋值 : 直接修改该变量 , 称为 直接赋值 ; 简介赋值...: 将该变量的地址 赋值 指针 , 通过 指针 修改内存中的变量数据 , 称为 间接赋值 ; 代码示例 : #include #include int main..., a); // 直接修改 变量 a 的值 a = 10; // 第二次打印 a 变量值 printf("a = %d\n", a); // 将 a 的地址赋值...如果 获取该变量的地址 , 将该 地址 传递给 函数形参 , 在外部函数中 , 通过指针地址 , 修改内存中的数据 ; 这同时也是 参数 作为 返回值 的原理 ; 代码示例 : #include <stdio.h..., a); // 直接修改 变量 a 的值 a = 10; // 第二次打印 a 变量值 printf("a = %d\n", a); // 将 a 的地址赋值

3.1K10

Python 为什么没有 main 函数为什么推荐写 main 函数

本期“Python 为什么”栏目来聊聊 Python 为什么没有 main 函数? 在开始正题之前,先要来回答这两个问题:所谓的 “main 函数”是指什么?...为什么有些编程语言需要强制写一个 main 函数?...函数最多只能有一个,也就是说程序的入口是唯一的 语法格式有一定的要求,具有相对固定的模板 为什么要强制一个main入口函数呢?...推荐阅读:Python 中 -m 的典型用法、原理解析与发展演变 推荐写if __name__ == '__main__'。首先,如果只有一个文件的话,因为不存在导出的可能,建议写。...小结:本文首先解释了什么是 main 入口函数,以及为什么某些语言会强制要求写 main 函数;接着,解释了为什么 Python 不需要写 main 函数;最后则是针对某些人存在的惯性误区,分享了我个人的四点编程经验

2.4K31

【C 语言】多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

文章目录 前言 一、在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) 二、完整代码示例 前言 如果要 通过 函数形参 间接赋值 修改 n 级指针, 需要向函数中传入 n + 1...级指针 形参 ; 一、在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) ---- 通过 函数 形参变量 , 间接赋值 返回 生成的 二级指针 函数 ; 如果要生成一个 二级指针 ,...必须传入 三级指针 , 才能修改 该 二级指针 ; 注意 : 传入的 三级指针 , 不要直接修改该值 , 先创建一个临时的 局部二级指针变量 , 将 二级指针 生成完毕后 , 最后再 三级指针 指向的地址...进行赋值 ; 代码示例 : /** * @brief 生成二维指针 * @param num * @return */ int generate_memory(char ***p3, int...= NULL) { free(p); } // 二维指针 置空 *p3 = NULL; } /** * @brief 主函数入口 * @return

99110

【C++】多态 ⑩ ( 建议将所有函数都声明为 virtual 虚函数 | 多态的理解层次 | 父类指针和子类指针步长 )

对象可以直接获取到自身封装的 普通函数 , 如果要访问虚函数 , 需要增加一次寻址操作 , 因此 这里建议不需要将有 多态 需求的函数声明为 虚函数 ; C++ 中 指向某类型对象的 指针 的 运算 ,...没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父类指针 的步长是相同的 ; 一、建议将所有函数都声明为 virtual 虚函数 C++ 类中 , 每个 成员函数 都可以声明为 virtual...调用 虚函数 可执行 子类对应的函数 ; 多态实现条件 : ① 继承 , ② 虚函数重写 , ③ 父类指针/引用指向子类对象 ; 父类指针 可以 指向 父类对象 , 也可以指向 不同的 子类对象 ;...; 有 虚函数 的类 , 在 编译时 , 会生成 虚函数表 , 对应类中生成一个 vptr 指针指向 虚函数表 ; vptr 指针 是 与 对象绑定的 , 调用时 从 对象的 虚函数表 中查找虚函数...; 通过 父类指针 访问虚函数时 , 直接根据 实际对象 的 vptr 指针找该对象的 虚函数表 , 然后调用 虚函数表 中的 虚函数 ; 多态意义 : 多态是 设计模式 的基础 , 是 软件框架 的基础

21950

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

的值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 将变量地址赋值指针变量 , 或者使用 malloc 函数分配内存赋值 指针变量 ; // 将变量地址赋值一级指针 p...= &a; 间接修改 指针变量 的值 , 首先要 将 指针变量 的 地址值 , 赋值 1 个 二级指针 变量 , 通过 * 符号 , 间接修改 一级指针变量的值 ; // 将一级指针的地址赋值二级指针...0 int *p = NULL; // 声明二级指针变量 , 并为其设置 NULL 初始值 int **p2 = NULL; // 将变量地址赋值一级指针...p = &a; // 打印一级指针地址 printf("%d\n", p); // 将一级指针的地址赋值二级指针 p2 = &p; // 间接修改指针的值...// 将一级指针的地址赋值二级指针 p2 = &p; // 间接修改指针的值 *p2 = 12345678; // 打印一级指针地址 printf("%d\

20.9K10

一级指针和二级指针,取地址和取地址调用函数区别及其应用

参数传递:通过一级指针可以将变量的地址传递给函数,并在函数中修改变量的值。通过二级指针可以将指针的地址传递给函数,并在函数中修改指针指向的数据。...返回多个值:通过二级指针可以在函数中修改指针指向的数据,并将修改后的数据通过指针返回。 多级数据结构:通过二级指针可以实现多级数据结构,例如二维数组的动态分配和访问、树的遍历和修改等。...在main函数中,通过传递&list作为参数调用insertNode函数,实际上是将链表的头指针list的地址传递给了二级指针head。...3.函数参数调用时取地址和取地址的区别 #include #include struct Node{ int data; struct Node...为了解决这个问题,我们需要将头节点的指针的地址传递给insertNode函数

5210

【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

文章目录 一、判定指针合法性 二、数组越界 三、不断修改指针变量值 四、函数中将栈内存数组返回 五、函数间接赋值形参操作 六、指针取值与自增操作 一、判定指针合法性 ---- 判定指针合法性时 , 必须进行如下判断...不懂 其中的内存 , 引用 相关的内存 原理 ; 二、数组越界 ---- 定义数组变量后 , 为其赋值时 , 赋值的内容 超出了数组的大小 ; 错误示例 : "abc" 字符串需要 4 字节内存...指向 ; 推荐 创建新的 临时局部指针变量 , 接收该 指针 , 需要修改指针时 , 修改 该 临时局部指针变量 ; 四、函数中将栈内存数组返回 ---- 如果在函数中 , 需要 创建一块内存空间 ,...返回调用者 ; 这块在 函数中 创建的内存 , 不能是数组 , 必须使用 malloc 函数 , 在 堆内存 中创建一块内存空间 ; 在 函数内 创建的数组 存储在 栈内存中 , 栈内存的数据 ,...在函数结束后 , 其被系统自动回收 , 该内存可能被写入其它数据 ; 五、函数间接赋值形参操作 ---- 在函数中 , 如果需要通过 函数的 形参指针变量 通过 间接赋值 返回相关结果 , 这个指针使用时要慎重

2.1K10

为什么日期加上多少天不能用DATEADD函数?| DAX实战小案例

因为DAX里有一个“高级”且“简单易懂”的函数DATEADD! 结果,在模型表里新增一列,使用DATEADD函数: 什么鬼?为什么2021年1月15日及以前的日期往前推15天的结果都没了?...其实,这里涉及到一个对“时间智能函数”的理解问题!...首先,时间智能函数调用的日期列,应该是“标记为日期表”的日期(在Power BI里会默认对每个日期列生成一个“日期表”),同时,其结果也会局限在这个“日期表”的范围之内!...非常简单,最原始、最“Low”的日期减法,就是正确的解法: 对于时间智能函数,千万不要望文生义地去理解和应用,否则,很容易出了错都不知道。后续我将整理更多的相关案例供大家参考。

1.3K20

【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )

自定义的 业务子函数 与 主函数 main() ; 定义的接口如下 : 要点 1 形参指针间接赋值 : 主要是获取子串大小 , 通过 int *sub_count 参数的 间接赋值 , 实现函数结果返回...: 形参指针处理 : 定义 局部 临时 指针变量 , 接收 函数形参变量 , 尽量不修改 函数 形参 的值 ; 形参指针判空 : 凡是传入的指针 , 一律判定指针是否合法 ; 形参返回值处理 : 返回值不要直接修改..., 先定义临时局部变量保存返回值 , 最后执行完毕 , 再将返回值 通过 间接赋值 赋值 形参中的 返回值指针 指向的 内存地址 ; /* * 获取字符串中子串个数接口 * char *main_str..., 是否包含 "abc" 子串 // 如果包含 , 返回子串第一次出现的指针地址 , 非 0 则执行循环体内容 // 如果包含 , 返回 NULL , 如果没有找到 , 退出循环..., 是否包含 "abc" 子串 // 如果包含 , 返回子串第一次出现的指针地址 , 非 0 则执行循环体内容 // 如果包含 , 返回 NULL , 如果没有找到 , 退出循环

3.1K10

踩坑经验 | 为什么建议在power bi 写dax的时候用search函数

12 2023-11 踩坑经验 | 为什么建议在power bi 写dax的时候用search函数 分享一个踩坑的经验,为什么建议大家在dax中使用search函数~ LEARN MORE 图片由通义万相绘制...明明什么都没有改,为什么dax函数突然就报空了么?...排查定位的过程比较无趣,这里就不赘述了,总之就是,鬼知道公司网络做了什么升级或者改动,导致USERPRINCIPALNAME()这个函数返回的值和之前不一样了。...search函数虽然好用,但是遇到这种情况真可谓是让人崩溃,毕竟一般情况下,咱也想不到另一个函数返回的值会发生变化。于是就翻车了。...然而现实中这种类似的在所有人意料之外的调整影响一直都有发生,search函数到了类似的常见中还是非常容易出问题的。 真心建议,这种用法以后还是别的,太坑了。

28940

C++:43---派生类向基类转换、静态动态的类变量

A{};int main(){ A a; B b; a = b; return 0;} ②不能将基类对象绑定到派生类的指针/引用上 A a;B *b;b = &a; //程序错误,不能将基类对象转换为派生类对象...将子类对象赋值父类对象,相当于将子类中的父类成员变量赋值父类 ?...但是这个演示案例中是将派生类对象赋值基类对象(而不是指针形式) class A { public: int a = 10; void show1()const { cout << "A:show1\n...A,相当于把B中属于A的内容赋值A,因此访问到A中的a,为10 打印“A:show1”:因为show1()不是虚函数,所以访问时跟左边的类型有关,此时为A,就访问A中的show1()函数 打印“A:show2...a1,b对象的内容被截断 a1 = a2; //将a2对象赋值a1 return 0; }

1.6K10

C++: 21---引用和指针

调用test函数 运行结果为: 0x6afecc 1 指针p为NULL 在main函数中声明了一个指针p,并赋值为NULL,当调用test函数时,事实上传递的也是地址,只不过传递 的是指地址。...当把指针作 为参数进行传递时,也是将实参的一个拷贝传递给形参,即上面程序main函数中的p何test函数中使用的p 是同一个变量,存储2个变量p的单元也不相同(只是2个p指向同一个存储单元),那么在test...为了检查你是否掌握引用和指针,到这里那我要提问几个问题: 1.拷贝构造函数的参数为什么必须是类对象的常引用Object(const Object& O1) ?...原因很简单 不能将一个常对象赋一个非常对象。 假如非引用传参,那么O1是不是要调用它的拷贝构造函数,传参后因为非引用传参,又要调用拷贝构造函数,如此递归,将陷入死循环。...假如是引用传参,则不会调用自己的拷贝构造函数。 2.如果作为函数参数,你希望函数内修改它,那么你选择指针还是引用?

69520

C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员

1.再谈构造函数 1.1构造函数赋值 根据之前介绍的内容:在创建对象时,编译器通过调用构造函数对象中各个成员变量一个合适的初始值,我们之前使用的构造函数都叫做函数体内赋初值 class Date...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化与赋值区别: 初始化是在创建变量时为其赋予一个初始值。在构造函数中,初始化通常是在对象创建时对成员变量进行赋值。...赋值操作符=用于将一个值赋一个已经存在的变量 初始化是在变量创建时进行的,而赋值是在变量已经存在的情况下进行的 初始化可以只进行一次,而赋值可以进行多次 在一些情况下,初始化可能比赋值更加高效,因为它可以在对象创建时直接将初始值传递给对象...对于count都在类外定义了,为什么不能直接访问呢?

59610

【C++】类和对象之初始化列表与static成员

再谈构造函数 2.1 构造函数赋值 在之谈到构造函数时候是在函数体里面初始化,举个例子: class Date { public: Date(int year, int month, int...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...因为初始化只能初始化一次,而构造函数体内可以多次赋值。...内置类型可以缺省值,而自定义类型个缺省值还要定义一个全局变量,很麻烦。 那么为什么下面这样可以?...this指针 3.2 特性 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区 静态成员变量必须在类外定义,定义时添加static关键字,类中只是声明 类静态成员即可用 类名::静态成员

11010

关于cpp中左值和右值的细枝末节

,只需要把右值中大块内存的指针地址赋值左值的指针即可。...这种情况类似于浅拷贝(shallow copy),不同之处在于浅拷贝没有把等号右边值的指针变为nullptr,右值(临时变量)在析构的时候将内存释放掉,左值指针指向的内容被释放掉了。...int t = 10; // 左值 ++t; // 左值 t++; //右值 第一行定义了t之后,t明显是个左值,能够对t进行取址,能够对其赋值,也能将赋值其他的变量...三、std::move()的作用 理解了右值的作用之后,需要看看c++11中增加的std::move()函数为什么需要这个函数?当函数为右值的时候不是可以自动重载吗?...这种时候不需要再在函数func(a)里面深拷贝a了,直接把a里面分配的内存str就行了。这个时候我们需要强制调用第一个函数,但是a又是个左值。怎么办?

52310

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数 1.1 构造函数赋值 在创建对象时,编译器通过调用构造函数对象中各个成员变量一个合适的初始值,以我们之前实现的Date类对象为例。...,对象中成员变量都有一个初始值了,但是不能将其成为对象中成员变量的初始化,构造函数中语句只能将其成为赋初值,不能叫做初始化。...// 实际编译器背后会用2023构造一个无名对象, //最后用无名对象d1对象进行赋值 } class Date { public: // 2....// 实际编译器背后会用2023构造一个无名对象, //最后用无名对象d1对象进行赋值 d1 = 2023; // 将 1 屏蔽掉,2放开时则编译失败,因为explicit修饰构造函数, //禁止了单参构造函数类型转换的作用...静态成员变量的类型可以是常量,引用,指针,类类型等。 并且,静态成员函数也不与任何对象绑定在一起,他们包含this指针

26110
领券