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

为什么将函数作为&name和name传递会产生不同的指针?

将函数作为&name传递时,会将函数的地址作为参数传递给函数,因此在函数内部可以通过指针来访问和修改函数。

而将函数作为name传递时,会将函数的值(即函数的代码)作为参数传递给函数,因此在函数内部无法通过指针来访问和修改函数。

这种不同的行为是由于函数在C/C++中被视为一种特殊的数据类型,可以像其他数据类型一样进行传递和操作。当函数名前加上&符号时,表示取函数的地址,即将函数作为指针类型传递;而不加&符号时,表示将函数作为值类型传递。

函数作为指针类型传递的优势在于可以实现回调函数的机制,即将一个函数作为参数传递给另一个函数,在适当的时候调用该函数。这在事件处理、多线程编程等场景中非常常见。

函数作为指针类型传递的应用场景包括但不限于:

  1. 回调函数:将一个函数作为参数传递给另一个函数,用于在特定事件发生时被调用。
  2. 函数指针数组:可以使用函数指针数组来实现函数的动态调用,根据不同的条件选择不同的函数执行。
  3. 函数指针作为结构体成员:可以在结构体中定义函数指针成员,用于实现不同的行为。

腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless Cloud Function):https://cloud.tencent.com/product/scf
  • 云开发(Tencent CloudBase):https://cloud.tencent.com/product/tcb
  • 云原生应用引擎(Tencent Cloud Native Application Engine):https://cloud.tencent.com/product/tcnae
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Effective Modern C++翻译(2)-条款1:明白模板类型推导

&& 条款26精确介绍了为什么这些例子会是这样,但关键是类型推导对于模板参数是万能引用(univsersal references)参数是左值或右值时规则是不同,当使用万能引用(univsersal...下面的声明是等价 void myFunc(int* param); // 上面的函数是一样 数组指针在参数上等价源于C++是以C为基础创建,它产生了数组指针在类型上是等价这一错觉。...因为数组参数声明被按照指针声明而对待,通过按值方式传递给一个模板参数数组将被推导为一个指针类型,这意味着在下面这个模板函数f调用中,参数T类型被推导为const char* f(name);...// 大小是7 函数参数 数组不是C++中唯一一个可以退化为指针实体,函数类型也可以退化为指针,我们讨论任何一个关于类型推导规则对数组相关事情对于函数类型推导也适用,函数类型退化为函数指针...在类型推导期间,数组函数退化为指针类型,除非他们是被实例化为相应引用。

770100

Go - 基于逃逸分析来提升程序性能

可能出现逃逸场景 01 02 03 小结 推荐阅读 前言 为什么需要了解逃逸分析?...因为我们想要提升程序性能,通过逃逸分析我们能够知道变量是分配到堆上还是栈上,如果分配到栈上,内存分配释放都是由编译器进行管理,分配释放速度非常快,如果分配到堆上,堆不像栈那样可以自动清理,它会引起频繁地进行垃圾回收...函数传递指针传值哪个效率高吗?...我们知道传递指针可以减少底层值拷贝,可以提高效率,但是如果拷贝数据量小,由于指针传递产生逃逸,可能会使用堆,也可能增加 GC 负担,所以传递指针不一定是高效。...不要盲目使用变量指针作为参数,虽然减少了复制,但变量逃逸开销可能更大。

50820

C++学习知识点

OOP面向对象程序设计多态理解 答:多态:同一操作作用于不同对象,可以有不同解释,产生不同执行结果。在运行时,可以通过指向基类指针,来调用实现派生类中方法。...为什么函数形参多是const修饰引用 使用引用是防止值传递,值传递之前会将实参在堆栈产生一份拷贝,而引用则不会,因此引用传递会改变实参值。...为什么基类类型指针在被子类对象赋值后不能访问子类成员函数呢?...对象赋给另外一个对象引用或者指针时,如何传递 当对象赋给另外一个对象引用或者对象时候,调用被赋值拷贝构造函数。此时就存在深拷贝浅拷贝。...(2) 当函数参数为类对象时,这时调用此函数时使用是值传递,也产生对象复制。

1.7K20

内存、引用、封装、函数

int(10); return p;}new操作符new在堆区开辟数据,释放利用delete利用new创建数据,返回该数据对应类型指针void test(){ int* p = new...:函数传参时,可以利用引用技术让形参修饰实参优点:可以简化指针 修改实参//引用传递void test2(int& a, int& b){ int temp = a; a = b;...cout << "b=" << b << endl;//10 return 0;}通过引用参数<em>产生</em><em>的</em>效果<em>和</em>地址<em>传递</em>是一样<em>的</em>,引用<em>的</em>语法更清楚简单引用作<em>函数</em>返回值不要返回局部变量引用int& test...<em>函数</em>重载作用:<em>函数</em>名可以相同,提高复用性<em>函数</em>重载满足条件:<em>函数</em>声明<em>和</em><em>函数</em>实现,只能有一个有默认参数同一作用域下<em>函数</em>名称相同<em>函数</em>参数类型<em>不同</em>,或者个数<em>不同</em>,或者顺序<em>不同</em>注意事项引用<em>作为</em>重载<em>的</em>条件//引用<em>作为</em>重载<em>的</em>条件...,会出现二义性C++面向对象<em>的</em>三大特性:封装、继承、多态C++认为万事万物皆为对象,对象上有其属性<em>和</em>行为具有相同性质<em>的</em>对象,我们可以抽象成为类,人属于人类,车属于车类封装封装<em>的</em>意义<em>将</em>属性<em>和</em>行为<em>作为</em>一个整体

74800

我揭开了「对象」神秘面纱,就这?

然后分别去实现这些实体应该具有的功能(即成员函数),然后你还要考虑不同实体之间如何交互传递消息,说白了就是调用关系传参。...,不过大家应该体会到了,函数指针最大优点就是函数变量化了。...我们可以函数作为参数传递给其它函数,那么这里其实就有了多态雏形,我们可以传递不同函数来实现不同行为。...所以当调用成员函数时候,我们还需要传入一个参数 this,用来指代当前是哪个对象在调用。 由于 C 语言不支持面向对象,所以我们需要手动 animal 作为参数传递给 eat、work 函数。...或者说,几乎所有的面向对象语言,都会存在一个类似的机制,来调用对象隐式传递给成员函数,比如 Python 中对象定义: class Stu: def __init__(self, name,

77110

为啥 Java 中不推荐 Optional 当做参数使用?

一、背景 最近开发过程中,身边同事为了实现逻辑复用,定义一个私有公共方法实现逻辑复用,定义函数签名时将上游 Optional 作为参数传递。 IDEA 给出警告,但是并没有讲清楚为什么。...那么,为什么不推荐作为参数使用呢? 二、讨论 2.1 为什么不要将 Optional 作为参数 如果 Optional 当做参数使用,那么本身可传递 null, 依然需要进行判空再使用。...当使用某个调用返回值传递时,通常不会出现空指针,但是自己去执行调用传递 null 时很容易出现空指针。 2.2 非要当做参数怎么办? 有些场景希望直接下游返回值作为参数传递。...可以使用 guava 包里 Optional类替代。 三、结论 【建议】不建议 Optional 作为参数,容易造成空指针误解,这 Optional 目的相违背。...如果是想传递某个调用,请使用 Supplier。 【建议】不建议 Optional 作为属性,非要用建议使用 guava 包 Optional 类。

2.8K20

Go语言中常见100问题-#45 Returning a nil receiver

然而上面的代码是可以编译通过,并且运行会输出bar,因为nil指针是有效接收器。 为什么这样呢?...func Bar(foo *Foo) string { return "bar" } 我们知道传递一个nil指针给一个函数是有效,因此,使用nil指针作为接收器是有效。...很简单,如果NameAge都是合法,直接在函数末尾返回nil而不是m, 代码如下 func (c Customer) Validate() error { var m *MultiError...总结,在Go语言中,允许使用nil作为函数接收器,而从nil指针转换接口不再是nil接口。因此,当我们必须返回一个接口时,不应该直接返回一个nil指针,而应该是一个nil值。...通常来说,拥有一个nil指针不是一个理想情况,这意味着一个可能错误。前面的代码只是一个示例,注意是这种问题不仅仅是与错误有关,而是使用指针接收器实现任何接口都有可能产生上述问题。

59620

T *[]*T 傻傻分不清楚

y 所有数据都打印出来,在 appendB 函数中追加数据其实已经写入了数组中,但为什么 x 本身没有获取到呢?...这是因为初始化 x 切片时长度容量都为3,当在 appendB 函数中追加数据时,会发现没有位置了。 这时便会进行扩容: 老数据复制一份到新数组中。 追加数据。...传递切片指针 有没有什么办法即便是在扩容时也能对外部产生影响呢?...最终在 appendC 中 x 指针指向了扩容后结构体,因为传递是 main 函数中 x 指针,所以同样 main 函数 x 也指向了该结构体。...切片也可以传递指针,但场景很少,还会带来不必要误解;建议值传值就好,长度容量占用不了多少内存。

44620

由 Go 结构体指针引发传递思考

map 传递 在 Go 中,所有的函数参数返回值都是通过值传递,这意味着它们都是原始数据副本,而不是引用或指针。...这两种传递方式决定了函数调用时参数是如何传递: 值传递:值传递复制数据 引用传递:引用传递复制是数据地址 Go 采用就是值传递,当调用一个需要参数函数时,函数参数复制一份,如果参数是一个指针...,也复制出来一个新指针对象,但注意复制指针对象,即新旧两个指针对象已经完全独立,有各自内存地址,但是两个指针对象内部指向目标对象地址没有改变,如下面代码图示: s := &S{Name:...,也就意味着这些类型作为函数参数传递时复制都是指针。...无论是值类型还是引用类型(如指针),在作为参数传递函数时都是通过值传递方式。

18810

golang新手容易犯3个错误

,append函数判断传入slicelencap,如果len即将大于cap,会调用make函数生成一个更大新数组并将原底层数组数据复制过来(以上均为本人猜测,未经查证,有兴趣同学可以去挑战一下源码...: 1 1 实际执行一遍,结果是: 1 2 为什么这样呢!?...在语言层面这也许并不是个错误,但是实际工作中如果误用,那么产生bug很隐秘。...3.传递当成引用传递 值类型数据引用类型数据区别我相信在座各位都能分得清,否则不用往下看了,因为看不懂。...在golang中,arraystruct都是值类型,而slice、map、chan是引用类型,所以我们写代码时候,基本不使用array,而是用slice代替它,对于struct则尽量使用指针,这样避免传递变量时复制数据时间空间消耗

1.3K41

C语言编程—内存管理

C语言中动态内存管理。C语言为内存分配管理提供了几个函数。这些函数可以在 头文件中找到。 在C语言中,内存是通过指针变量来管理。...= %s\n", name ); printf("Description: %s\n", description ); } 当上面的代码被编译执行时,它会产生下列结果: Name = Zara...重新调整内存大小释放内存 当程序退出时,操作系统自动释放所有分配给程序内存,但是,建议您在不需要内存时,都应该调用函数 free() 来释放内存。...); } 当上面的代码被编译执行时,它会产生下列结果: Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th...free() 函数:用于释放先前分配内存。它接受一个指向要释放内存指针作为参数,并将该内存标记为未使用状态。 calloc() 函数:用于动态分配内存,并将其初始化为零。

21830

熬夜整理万字CC++总结(二),值得收藏

显然,方案二更好一些,方案二类似使用指针传递地址,方案一内存中内容重新“复制”了一份,效率比较低。...与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。 什么情况下导致野指针?...一个void指针存放着一个地址,这一点其他指针类似。不同是,我们对它到底储存是什么对象地址并不了解。...注意:对一个int类型指针解引用产生一个整型值,类似地,对一个float指针解引用产生了一个float类型值。...printf("p2 =%d\n", p2); printf("p2+1=%d\n", p2 + 1); 1.1.5 函数指针 1.1.5.1 函数参数指针 C语言中,实参传递给形参,是按值传递

1.2K20

Golang中逃逸分析 顶

概念介绍 逃逸分析 逃逸分析是编译器用来确定由程序创建值所处位置过程。具体来说,编译器执行静态代码分析,以确定是否可以值放在构造函数栈(帧)上,或者该值是否必须逃逸到堆上。...注意:虽然当使用fmt.Println时候又会出现逃逸,但是当使用fmt.Println(*name)fmt.Println(name),也是不同。...实际上对你来说是透明,不需要过度关心 每个 Go 版本逃逸分析都会有所不同(会改变,优化) 直接通过go build -gcflags '-m -l' 就可以看到逃逸分析过程结果 到处都用指针传递并不一定是最好...但是如果太大(10000)也逃逸,因为栈空间是有限 思考 函数传递指针真的比传值效率高吗?...我们知道传递指针可以减少底层值拷贝,可以提高效率,但是如果拷贝数据量小,由于指针传递产生逃逸,可能会使用堆,也可能增加GC负担,所以传递指针不一定是高效

1.1K10

C++都有对象了,你还没有吗?

金句分享: ✨应该有更好方式开始新一天,而不是千篇一律每天醒来.✨ 一、面向过程与面向对象 C语言作为一种面向过程编程语言,注重解决问题过程步骤,通过函数控制流程设计来组织程序。...C++是基于面向对象,关注是对象,一件事情拆分成不同对象,靠对象之间交互完成。 现实实例:制作一个简单三明治。...(1)声明定义全部放在类体中. 注意:成员函数如果在类中定义,编译器默认是按内联函数(inline)处理.(同样如果函数体过长也是不会产生内联.)...#include using namespace std;//在工程代码中不建议展开可能产生命名冲突 class Person { public: // 构造函数(后面会讲...,但是并没有对this指针进行解引用,传递指针是不会报错.

17620

bug诞生记——临时变量、栈变量导致双杀

当然实际代码逻辑远比下文例子要复杂很多,我只是抽出比较核心点来分析。至于为什么要这么做?为什么要这么设计?为什么要这种风格?为什么代码不严谨?……等与问题核心无关疑问,我都将不做辩论。...此时一个具有“良知”但是“缺乏知识点”同事走上“犯罪”道路,因为他抱着“优化代码”目的去产生了第一个bug。...这是值得肯定。 精简了get_name函数,不再以full_name作为返回值,减少了一次std::string类型构造释放。这个也是值得肯定。...第6行将该对象指针放到当前函数栈帧内——即一个临时对象。         第7行又将临时对象地址放到ecx中。ecx在C++编译中,一般用于传递this指针。        ...main中std::string全干掉了。         这段代码修改足够简单了。有人可能觉得get_name可能可以干掉,直接在main函数中写死路径就行了。

76720

C++之面向对象语法笔记

&引用传递函数调用中,如果需要将类对象作为形参,传入到某个函数进行调用,这种情况分为值传递引用传递。...值传递 //为什么这里只调用了析构函数,没有调用构造函数?...拷贝构造函数通常用于: 通过使用另一个同类型对象来初始化新创建对象。 复制对象把它作为参数传递函数。 复制对象,并从函数返回这个对象。 对拷贝,C++ String源码,最能体现。...C++ 多态意味着调用成员函数时,根据调用函数对象类型来执行不同函数。...重载函数之间区分主要在参数常量性(const)不同上,若仅仅是返回值或修饰符 virtual,public/protected/private不同不被视为重载函数(无法通过编译)。

1.5K40

从零开发区块链应用(八)--结构体初识

Go 语言 struct,与 C 语言中 struct 或其他面向对象编程语言中类(class)类似,可以定义字段(属性)方法,但也有很不同地方,需要深入学习,才能区分他们之间区别。...结构体与数组一样,都是值传递,比如当把数组或结构体作为实参传给函数形参时,复制一个副本,所以为了提高性能,一般不会把数组直接传递函数,而是使用切片(引用类型)代替,而把结构体传给函数时,可以使用指针结构体...这是因为,结构体是值传递,当我们调用 setName 时,方法接收器接收到是只是结构体变量一个副本,通过副本对值进行修复,并不会影响调用者,因此,我们可以方法接收器定义为指针变量,就可达到修改结构体目的了..."小明") fmt.Println(m.Name)//小明 方法字段一样,如果首字母为小写,则只允许在包内可见,在其他包中是无法访问,因此,如果要在其他包中访问setName,则应该方法名改为SetName...,是复合类型,无论是作为实参传递函数时,还是赋值给其他变量,都是值传递,即复一个副本。

67210

iOS 内存管理相关面试题

程序刚启动时候,也创建一个自动释放池 产生事件以后,运行循环开始处理事件,就会创建自动释放池 2.8 什么时候销毁?...多线程并发访问提高性能,但无法保证数据同步。尽量避免多线程抢夺同一块资源,否则尽量加锁资源抢夺业务逻辑交给服务器处理,减少移动客户端压力。...继承关系 组合关系 对象作为方法参数传递 对象组合关系中,如何确保作为成员变量对象,不会被提前释放?...栈有2种分配方式:静态分配动态分配。静态分配是编译器完成,比如局部变量分配。动态分配由alloc函数进行分配,但是栈动态分配堆是不同,他动态分配是由编译器进行释放,无需我们手工实现。...程序在编译期对变量函数分配内存都在栈上进行,且程序运行过程中函数调用时参数传递也在栈上进行。 队列栈有什么区别: 队列栈是两种不同数据容器。

1.5K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券