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

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

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

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

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

相关搜索:当尝试查找一个指针时卡住了,指针是“找出写到这个地址的内容”如果array_name是一个指针,为什么不是int *ptr = array_name而不是指向指针的指针为什么这个typescript函数假定im传递的是字符串而不是数字为什么这个程序返回的是最后一个单词而不是最长的单词?为什么带索引的数组指针返回该索引中的值,而不是返回特定的索引地址?为什么我得到的是这个而不是一个字符串?为什么这个查询在没有匹配结果时崩溃,而不是返回一个空结果?为什么这个`ctyes`封装函数的返回值是`c_long(0)`而不是ctyes`(3)`?尝试访问struct指针的第一个成员(本身是易失性指针)时,返回的不是存储的成员指针,而是结构地址为什么rxjs concat在传递数组而不是单个参数时会产生不同的值?为什么玩家输入的代码是一个值是80的和,而不是一个数字(12345678)?在React将ID从一个页面传递到另一个页面时,它传递的是URL,而不是API为什么我们在计算校验和时使用1的补码而不是2的补码有没有办法在初始化枚举时传递一个变量,而不是传递java中的实际值?当N=1时,为什么我得到的是一个空列表而不是[0]当我抓取一个循环而不是直接访问它时,这个网页是如何阻止我的?为什么我在web抓取时得到的是一个空列表而不是一个包含元素的列表当“猜测”数字是随机生成的,而不是基于上下限的平均值时,为什么这个程序可以工作?当我通过泛型传递实体时,为什么属性是重复的,而不是所需的存储在数据库中?当使用返回时,为什么递归只产生第一个嵌套的对象值,而不是其余的值?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

52120

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

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

3.8K41
  • C-指针进阶知识

    p4是数组指针 数组指针p4的值虽然和数组名p3一样,都是数组的起始地址,不过前者是”数组p3这个对象“的起始地址,后者是数组p3内首元素“的起始地址,它们的值完全相同,但是表示的范围跨度就不一样了,从现象上来看...add1的值是函数的首地址,它的类型是void (int) add2(也就是&add1)表示的是一个指向函数add1这个对象的指针,它的类型是void (*)(int) add1和add2(即&add1...)所代表的地址值是一样的,但是类型不一样 为什么要强调这一点?...*的别名 方便以后为变量更改类型 可移植性 某一个值在不同计算机上的类型,可能是不一样的。...void*可以直接和其他类型的指针比较存放的地址值是否相同 当要使用void*的时候,必须要进行强制类型转换,否则不知道这个指针究竟是什么类型的 这里要补充的是,承接和使用不同,一个是被赋值,一个是用与进行操作

    9710

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

    最重要的是:当实参传递给形参的时候,形参只是实参的一份临时拷贝,通过改变形参不能使实参发生改变!!! ---- 二、函数调用时的处理 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中含义不同:引用结果为引用类型的大小

    10410

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

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

    1.1K20

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

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

    1.1K20

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

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

    93520

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

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

    56310

    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 *。

    99210

    18.Go面向对象-方法

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

    22710

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

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

    32420

    『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

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

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

    1.8K30

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

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

    21510

    函数调用时栈是如何变化的?

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

    3.5K21

    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

    31430

    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.2K00

    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。...这里有一个名字是Person的struct,它有两个字段。我将这个struct作为参数传递给printPerson并打印相关的信息。

    1.1K40

    函数实参与形参详解

    sqrt(a) 的括号内的 a 就是实参,函数会使用这个实参进行计算。 实参的特点包括: 实参可以是常量、变量或表达式。 实参在调用函数时被传递给函数的形参。...0; } 在这个例子中,print_square_root 函数有一个形参 num,在 main 函数调用 print_square_root 时,实参 x 被传递给形参 num,然后 num 在函数体中被用于计算平方根...实参和形参的传递方式 在C语言中,函数的参数传递主要有两种方式: 值传递:传递的是实参的值,函数内部对形参的操作不会影响实参本身。 指针传递:传递的是实参的地址,函数内部可以通过形参修改实参的值。...} 在这个例子中,increment 函数接受一个指针 a,并通过解引用 *a 修改实参的值。...与值传递相比,指针传递效率更高,特别是在处理大型数据时,避免了不必要的内存复制。 总结 在C语言中,实参和形参是函数定义和调用时的核心概念。

    24320
    领券