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

为什么这个指针在计算sum时传递的是一个值而不是地址?

这个指针在计算sum时传递的是一个值而不是地址,可能有以下几个原因:

  1. 传递值而不是地址可以避免对原始数据的修改:如果传递指针的地址,函数内部可能会修改原始数据的值,这可能会导致意外的副作用。通过传递值,可以确保原始数据的不变性,避免出现意外的修改。
  2. 简化函数调用:传递指针的地址需要在函数调用时进行取址操作,而传递值则不需要。这样可以简化函数调用的过程,减少代码的复杂性。
  3. 提高代码的可读性:传递值可以使代码更加直观和易于理解。通过传递值,可以清晰地表达函数所需的参数,而不需要关注指针的具体地址。
  4. 减少错误的可能性:传递指针的地址可能会导致错误的使用,例如在函数内部误操作修改了指针的地址,或者在函数外部忘记取地址操作。通过传递值,可以减少此类错误的发生。

总结起来,传递值而不是地址可以避免对原始数据的修改,简化函数调用,提高代码的可读性,并减少错误的可能性。

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

相关·内容

指针函数和函数指针「建议收藏」

不过使用指针函数,需要注意一点,相信细心地读者已经发现了,对比func_sum和func_sum2函数,除了返回不一样之外,还有一个不同地方在于,func_sum中,变量sum使用静态局部变量...其实原因在于,一般局部变量存放于栈区,当函数结束,栈区变量就会释放掉,如果我们函数内部定义一个变量,使用一个指针去指向这个变量,当函数调用结束这个变量空间就已经被释放,这时就算返回了该地址指针...上面的示例中,返回该指针后,立即访问,的确是得到了正确结果,但这只是十分巧合情况,如果我们等待一会儿再去访问该地址,很有可能该地址已经被其他变量所占用,这时候得到不是我们想要结果。...回调函数 函数指针一个非常典型应用就是回调函数。 什么回调函数? 回调函数就是一个通过指针函数调用函数。其将函数指针作为一个参数,传递给另一个函数。...回调函数并不是由实现方直接调用,而是特定事件或条件发生由另外一方来调用

48320

JavaScript 如何工作:JavaScript 共享传递和按传递

但在 JS 中,string 就是一种原始类型数据不是对象类。...但是 JavaScript 中就像前面所说,JS 中,string 就是一种原始类型数据不是对象类,所以是按传递,所以 setNewString 中更改 str 不会影响到外面。...重新指向那个,即 [1, 2],但最后打印结果可以看出 arr1 还是原先,这是为什么呢?...调用堆::这个区域跟踪当前正在执行函数,执行计算并存储局部变量。变量以后进先出法存储堆栈中。最后一个进来一个出去,数值数据类型存储在这里。...函数被调用,传入分别为 90 和 100 a 和 b。 记住:数据类型包含引用数据类型包含内存地址调用 sum 函数之前,将其参数推入堆栈 ESP->[......]

3.7K41

调用函数,关于传参那些事~

最重要:当实参传递给形参时候,形参只是实参一份临时拷贝,通过改变形参不能使实参发生改变!!! ---- 二、函数调用时处理 1.传 看到传,那么就是调用函数实参具体。...我们通过传递a和b地址,分别给形参中指针变量int *px=&a,int *py=&b,来通过解引用交换两个变量!...指针变量可以通过解引用*px,*py,来通过地址访问到a和b,交换*px,*py,即交换a,b。 ---- 那为什么不像第一种那样传交换呢?  ...下面我们具体看一个实例:(二分查找) //数组传参实际上传递数组首元素地址 //不是整个数组 //所以函数内部计算一个函数参数部分数组元素个数不靠谱 int binary_search...当我们传数组时候,只需将数组名(链接中更详细)传到形参即可,通过数组首元素找到剩下数组元素。 此时形参中int arr[ ]不是整型数组,而是一个指针变量!!

1.4K20

初谈C++:引用

为什么最后还能打印出最终结果? 对于这种传返回,会有一个临时变量生成,这种临时变量用来存储返回,当返回比较小时候,这个临时变量就是寄存器。...以上局部变量中 那么以satic修饰变量静态区,此变量虽然不会随着调用函数栈帧销毁销毁,但是返回时候也会创建临时变量。 因此不难看出,传返回都会生成一个中间变量。...,发现传指针作为传参以及返回类型上效率相差很大 引用和指针区别 语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间 底层实现上实际有空间,因为引用是按照指针方式来实现...引用和指针不同点: 引用概念上定义一个变量别名,指针存储一个变量地址。...引用在定义必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 sizeof中含义不同:引用结果为引用类型大小

8110

golang学习笔记9:函数参数与返回

如果你希望函数可以直接修改参数不是对参数副本进行操作,你需要将参数地址(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数一个指针...如果传递给函数一个指针指针一个地址)会被复制,但指针所指向地址不会被复制;我们可以通过这个指针来修改这个所指向地址。...(译者注:指针也是变量类型,有自己地址,通常指针指向一个变量地址。所以,按引用传递也是按传递。) 几乎在任何情况下,传递指针一个32位或者64位消耗都比传递副本来得少。...传递变长参数 如果函数最后一个参数采用 ...type 形式,那么这个函数就可以处理一个变长参数,这个长度可以为 0,这样函数称为变参函数。...因为 return 语句同样可以包含一些操作,不是单纯地返回某个)。

1.1K20

函数指针指针函数学习小结

==== 一、指针函数 当一个函数声明其返回一个指针,实际上就是返回一个地址给调用函数,以用于需要指针地址表达式中。...输出这个地址。 二、函数指针 指向函数指针包含了函数地址,可以通过它来调用函数。声明格式如下: 类型说明符 (*函数名)(参数) 其实这里不能称为函数名,应该叫做指针变量名。...取地址运算符&不是必需,因为单单一个函数标识符就标号表示了它地址,如果函数调用,还必须包含一个圆括号括起来参数表。...为遍历数组以找到一个负值,FindCredit()函数进行自增运算对象是调用者指向数组指针不是它自己指向调用者指针指针。语句(*fpp)++就是对形参指针指向指针进行自增运算。...具有零指针常常被用做循环数组终止符。程序员称零指针为空指针(NULL)。采用空指针作为终止符,树种增删元素,就不必改动遍历数组代码,因为此时数组仍然以空指针作为结束。

1.1K20

程序员C语言快速上手——基础篇(五)

需要注意,函数返回和形式参数都是可选,当有返回,必须配合return语句返回,当函数没有返回,应当使用void关键字声明,注意我措辞,应当,不是必须!...网上存在很多错误言论和资料,一定要明确,C语言中,数组不存在传递,这也是为什么不能对做函数参数数组使用sizeof运算原因所在,因为它会自动退化为指针。...如何理解内存 理解了抽象意义上指针概念,接下来看看,计算机中内存又是怎么回事? ? 在这里插入图片描述 计算机中,内存就是一片线性连续小格子。...存数据,操作系统只关心两件事,一个分配给你起始地址一个分配格子长度。...图示 注意,指针变量应当是一个地址不能其他。因此给指针变量赋值,先使用取地址符&求得变量地址,然后才将这个地址赋给指针变量,这个过程称为指针指向某某变量。

90020

Rust FFI 编程 - Rust导出共享库01

两边代码使用一个程序栈,栈上指针能放心地传递不用担心被错误释放问题(栈上内存被调用规则自动管理,C和Rust中都是如此)。.../ccode01 输出下面结果: print in rust, sum is: 3 C 中处理返回 上个示例,Rust 中计算,并没有返回给 C 这边。我们看看怎么返回回来。...C 向 Rust 传入一个数组计算元素和并返回 前面两个例子最简单整型类型参数传递,能说明 Rust 导出共享库基本样板操作。但在函数参数这块儿,能说明问题有限。...数组传递,实际剖分成两个要素传递: 数组地址,或首元素指针(这两个本质一样),数组指针类型就是指向数组首元素指针类型; 数组长度。数组长度不是数组所占字节长度,而是元素个数。...可以看到,这个例子中,C 中数组分配在栈上,并且分配直接初始化了。 Rust 代码中,参数中 *const u32 就对应 C 中 const uint32_t *。

89310

C++学习笔记---------基础知识sizeof用法

看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,不加括号吗?sizeof可以,所以sizeof不是函数。...但是实际上,传入自函数Sum,只是一个int 类型指针,所以sizeof(i)=4,不是24,所以会产生错误结果。解决这个问题方法使指针或者引用。   ...所以32位计算机中,一个指针变量返回必定是4(注意结果是以字节为单位),可以预计,将来64位系统中指针变量sizeof结果为8。...数组“传址”,调用者只需将实参地址传递过去,所以a3自然为指针类型(char*),c3也就为4。 7. 结构体sizeof 这是初学者问得最多一个问题,所以这里有必要多费点笔墨。...由于结构体成员可以是复合类型,比如另外一个结构体,所以寻找最宽基本类型成员,应当包括复合类型成员子成员,不是把复合成员看成一个整体。

53710

18.Go面向对象-方法

( a Integer), 这个方法中称之为接收者,所谓接受者就是接收传递过来一个参数,然后复制a, a类型Integer ,由于Integerint别名,所以a类型为int 第二:...result变量传递给Test()方法接受者,也就是参数a,实参Test(3),会传递形参b. 当然,我们也可以将Test()方法,理解成为int类型扩展了,追加了方法。...,调用修改数据方法 student.PrintShow() // 调用结构体方法 } 创建方法,接收者类型为指针类型,所以调用方法,创建一个结构体变量,同时将结构体变量地址传递给方法接收者...结构体指针 可以 调用 普通结构体变量 方法 为什么结构体指针变量,可以调用PrintShow()方法呢? 原因:先将指针stu,转换成*stu调用。...调用过程中,也能体会出确实很方便,,不需要考虑太多指针问题 练习2: 写一个Ticket类,有一个距离属性, 不能为负数,有一个价格属性, 并且根据距离distance计算价格Price (1元/

20010

C语言学习——指针精华(2)

注意:函数指针声明为指针,它与变量指针不同之处,它不是指向变量,而是指向函数。 (1)函数指针实质还是指针,还是指针变量。...),所以对于函数来说很关键就是函数中第一句代码地址这个地址就是所谓函数地址C语言中用函数名这个符号来表示; (4)结合函数实质,函数指针其实就是一个普通变量,这个普通变量类型函数指针变量类型...,它就是某个函数地址(也就是它函数名这个符号在编译器中对应地址)。...指针函数实质一个函数 指针函数实质一个函数。函数都有返回类型(如果不返回,则为无型),只不过指针函数返回类型某一类型指针。...} } int *p1; p1 = fun(a); //指针函数调用 指针函数作用:可以使代码更简洁并在一定程度节约内存;如当你需要返回一个数组中元素,你就只需返回首元素地址给调用函数

30020

『C++』我想学C++,C++太难了,那我想入门,给我10分钟我带你入门

main前面的int就是主函数类型. cout 格式输出函数,这里就记住它功能就是屏幕上输出指定信息 return函数返回,根据函数类型不同,返回也是不同。...使用标识符还有注意以下几点: 标识符长度最好不要超过8位,因为某些版本C中规定标识符前8位有效,当两个标识符前8位相同时,则被认为一个标识符。 标识符严格区分大小写。...再浅显讨论sizeof作用 sizeof(int)*k之所以用sizeof(int)*k不是用k,因为sizeof(int)*k返回字节数,因为数组int 型sizeof计算每个元素字节长度...②地址传递 地址传递传递不同在于,它把实参存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针所指向地址中内容任何改变都会影响到实参。...名字含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足生活不是为了生计到处奔波。“世人慌慌张张,不过图碎银几两。

1.6K10

初识函数栈帧创建与销毁(笔记)

EBP保存了调用函数堆栈顶部地址,通过维持这个固定堆栈框架,可以方便地通过相对偏移访问不同局部变量。 3.栈顶指针(ESP):ESP寄存器用于跟踪和管理堆栈的当前顶部地址。...7.LEA(Load Effective Address):LEA指令目的计算有效地址存储寄存器中,以便稍后可以使用该地址来访问内存中数据。...例如,常用寄存器如 EBX、ESI 和 EDI 等会被保存在栈帧中 在这个例子中,a和b参数将被保存在栈帧中,变量sum将在栈帧中分配存储空间,这个空间通常是顶部。 4....一些能解释问题: 1.局部变量怎么创建? 首先为函数分配好栈桢空间,栈桢空间里初始化一部分空间之后, 然后给局部变量栈桢中分配一点空间 2.为什么局部变量不初始化时值随机?...,就能找esp顶,下一个空间 我们记住了call指令下一条地址,当我们往回返时候, 就可以转到call指令下一条指令地址,让函数返回 返回通过寄存器带回来 函数返回指向形参指针时候

14010

Visual Studio 中断模式下检查和修改数据

数据提示 数据提示用于调试过程中查看程序中变量和对象有关信息最方便工具之一。 调试器处于中断模式,可以在当前范围内查看变量,方法将鼠标指针置于源窗口中变量上。...结构或类 分配一个临时变量作为隐含参数传递给被调用函数,被调用函数将返回复制到这个隐含参数之中,并且将其地址赋给EAX寄存器。 浮点类型 通过专门浮点指令使用栈来传递。...可能许多人看了这个技巧后会大惑不解。“$env”是什么东西?为什么 “即时”窗口中输入“$env=0”会显示被调试进程所有环境变量? “$env”一个伪变量。...对于伪变量“$env”,如果试图“即时”窗口中修改它,那么就会将所有的环境变量显示出来,不是显示环境块大小。...对于伪变量“$CMDLINE”,如果试图“即时”窗口中修改它,那么就会将启动程序命令行字符串显示出来,不是字符串大小。

1.6K30

函数调用时栈如何变化

如图所示,栈由高地址向地地址方向生长,而且栈有其栈顶和栈底,入栈出栈地方就叫做栈顶。 x86系统CPU中,rsp指针寄存器,这个寄存器中存储着栈顶地址。rbp中存储着栈底地址。...函数栈空间主要是由这两个寄存器来确定。 当程序运行时,栈指针rsp可以移动,栈指针和帧指针rbp一次只能存储一个地址,所以,任何时候,这一对指针指向一个函数栈帧结构。...指针rbp不移动,访问栈中元素可以用-4(%rbp)或者8(%rbp)访问%rbp指针下面或者上面的元素。...该寄存器中存储着栈中一个地址(原rbp入栈后栈顶),从该地址为基准,向上(栈底方向)能获取返回地址、参数值,向下(栈顶方向)能获取函数局部变量值,地址处又存储着上一层函数调用时rbp。...需要说明sum两个参数和返回都是int,在内存中只占4个字节,图中每个栈内存单元按8字节地址边界进行了对齐,所以才是下图中这个样子。 再来看紧接着三条指令。

3K21

C Primer Plus(六)

因为数组名该数组首元素地址,作为实际参数数组名要求形式参数一个与之匹配指针。只有在这种情况下,C 才会把 int arr[] 和 int * arr 解释成一样。...而对于数组来说,必须传递指针。有时传递地址会导致一些问题,例如无意修改了源数据。 K&R C 年代,避免类似错误唯一方法提高警惕。ANSI C 提供了一种预防手段。...如果函数意图不是修改数组中数据内容,那么函数原型和函数定义中声明形式参数应使用关键字 const。...这里一定要理解,这样使用 const 并不是要求原数组常量,而是该函数处理数组将其视为常量,不可更改。...没问题,更改rates[0] 最后,创建指针还可以使用 const 两次,使得该指针既不能更改它所指向地址,也不能修改指向地址: double rates[5] = {88.99, 100.12

29030

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

如果一个变量可寻址,那么你可以使用取地址操作符 & 来获取它内存地址临时值都是不可寻址,临时值一句话概括就是表达式中间状态,它们生命周期很短,只表达式计算过程中存在。...map 传递 Go 中,所有的函数参数和返回都是通过传递,这意味着它们都是原始数据副本,不是引用或指针。...为什么要这样设计 为什么 map 要返回一个副本回来,不是返回原始对象地址?这种设计选择出于安全性和一致性考虑。...这两种传递方式决定了函数调用时参数如何传递传递传递复制数据 引用传递:引用传递复制数据地址 Go 采用就是传递,当调用一个需要参数函数,函数参数会复制一份,如果参数一个指针...无论类型还是引用类型(如指针),作为参数传递给函数都是通过传递方式。

17310

C++之类和对象

,当用户主动传递编译器会报错;不过成员函数内部我们可以显示去使用 this 指针: this指针特性 this指针有如下一些特性: 1.this 指针只能在 “成员函数” 内部使用...指向其他对象) 3.this 指针本质上“成员函数”一个形参,当对象调用成员函数,将对象地址作为实参传递给 this 形参,所以对象中不存储this 指针; 4.this 指针“成员函数”...第一个隐含指针形参,一般情况由编译器通过建立“成员函数”函数栈帧压栈传递,不需要用户主动传递。...this指针作为参数传递允许为空成员函数里也没有对this指针进行解引用。 代码2运行崩溃,因为成员函数中对this指针进行解引用了,this指针一个指针。...因为类成员函数第一个参数隐藏this指针日期类this指针完整类型:Date const*this,这个const修饰this指针本身,也就是说this指针指向可以修改

1.1K00

RISC-V 函数调用约定和Stack使用

看起来使用x86不是RISC-V唯一优势就是能得到性能提升,但是这里性能是以复杂度和潜在安全为代价,我问题为什么我们还在使用x86,不是使用RISC-V处理器?...但是这个问题更实际答案,RISC-V相对来说更新一些,目前还没有人基于RISC-V来制造个人计算机,SiFive也就是最近才成为第一批将RISC-V应用到个人计算公司。...寄存器用来进行任何运算和数据读取最快方式,这就是为什么使用它们很重要,也是为什么我们更喜欢使用寄存器不是内存。 当我们调用函数,你可以看到这里有a0 - a7寄存器。...一个函数sum_then_double就不是一个leaf函数了,这里你可以看到它调用了sum_to。 所以在这个函数中,需要包含prologue。...这里有一个名字Personstruct,它有两个字段。我将这个struct作为参数传递给printPerson并打印相关信息。

59740

C语言中函数基本知识

函数和指针这两大块,C语言中占据着重要位置,C语言中主体和核心,所以它们重要性也就不言喻了。 那什么函数呢?...传就是直接用一个变量去存储那个地址就是用一个变量(指针变量)去记住那个地址 这里需要了解一个知识点: 1:数组名,就是一个一个指针常量。...其实是没,两者可以说是一样,因为址传递传递地址地址这个,由形参里面的指针变量存放着。...根据要注意点中,第二个要点,我想在被动用函数中就改变主调函数中参数,那么我就需要把地址传递进去,也就是进行址传递,那么我函数定义就需要借助指针为什么会如此呢?...本次涉及到了指针知识,指针又是一个比较难理解地方,要理解指针,就需要内存地址一个深刻理解,在学习指针时候,可以用纸和笔纸上勾画下 数据方框和地址方框,用箭头来表示指针指向地址方框来理解指针

78420
领券