指针传递传递的是内存地址的副本还是指针的副本

news/2025/3/4 14:47:58/文章来源:https://www.cnblogs.com/maidongdong/p/18750486

在 Go 语言中,指针传递传递的是指针的副本,而这个指针本身是一个内存地址的值。所以更精确地说,传递的是内存地址的副本

让我详细解释一下:

  1. 指针是什么?

    • 在 Go 中,指针是一个变量,它存储的是另一个变量的内存地址。比如 var p *intp 是一个指针,指向某个整数的内存地址。
    • 内存地址本身是一个值(通常是 64 位或 32 位整数,取决于系统架构)。
  2. 指针传递的过程

    • 当你将一个指针传递给函数时,比如 func foo(p *int),Go 会将这个指针的值(即内存地址)复制一份,传递给函数。
    • 函数接收到的 p 是原始指针的副本,但这个副本仍然指向相同的内存地址。
    • 因为是指向同一地址,函数可以通过解引用(*p)修改原始值。
  3. 为什么说是“内存地址的副本”?

    • 传递的不是原始指针变量本身,而是它的值(内存地址)的副本。
    • 这意味着函数内部如果修改了指针变量本身(比如让 p 指向另一个地址),不会影响调用处的原始指针。但如果修改的是指针指向的内容(*p),则会影响原始值。

示例代码

package mainimport "fmt"func modifyPointer(p *int) {fmt.Printf("函数内指针地址: %p\n", p) // p 是指针的副本*p = 100                        // 修改指针指向的内容
}func reassignPointer(p *int) {x := 200p = &x // 修改 p 本身,让它指向新地址
}func main() {a := 10fmt.Printf("原始指针地址: %p\n", &a)modifyPointer(&a)fmt.Println("修改后 a 的值:", a) // 输出 100reassignPointer(&a)fmt.Println("尝试重新赋值后 a 的值:", a) // 输出 100,未改变
}

输出解释

  • modifyPointer(&a):函数内的 p&a 的副本,指向同一个地址,修改 *p 会改变 a 的值。
  • reassignPointer(&a):函数内的 p 是副本,重新赋值 p = &x 只影响副本,不影响原始的 &a,所以 a 不变。

结论

  • 指针传递传递的是指针的副本,这个副本是一个内存地址的值。
  • 函数内部可以通过这个地址修改原始数据,但如果修改指针本身(让它指向新地址),不会影响外部的原始指针。

希望这个解释清楚了你的疑问!如果还有困惑,欢迎继续提问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893426.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

升级到Windows 11 24h2版本后惠普打印机报错spl error 11-1114 line 601

问题描述 近日升级到Windows 11 24h2版本后发现使用HP Laser MFP 1136w Printer打印文档皆会打出一页报错页面,内容如下图所示,但是使用HP Smart Assistant打印PDF一切正常,尝试了使用HP SMART进行修复,修改网络连接方式,重新添加打印机等等方式皆无果。解决方案 排查后发…

Outlook邮箱登录失败,0x80190001错误的多种解决方法

一、Outlook邮箱客户端“0x80190001”解决方法起初出现这个问题我以为是电脑有病毒了,无奈之下全盘杀毒仍然无法解决,随后开始搜索“0x80190001”相关问题查阅,试过好多办法依然无效,直到我找到以下方法:“win+s”打开搜索界面,找到“Internet选项”点击进入该项设置。在…

AUTOSAR网络管理自动化测试如何创建测试框架

在AUTOSAR网络管理自动化测试中,需求分析、模块化设计、自动化执行是创建测试框架的核心要点,其中模块化设计尤为关键,通过将复杂的网络管理功能拆分为独立模块,实现灵活扩展与维护;这不仅能提高测试效率,还能在多变的系统环境中保持稳定性。采用标准化的设计模式,并辅以…

jmeter中的while循环控制器中变量提取

${__javaScript(${status}==0)} ${__groovy(vars.get("status") == 0)}

docker compose部署nacos高可用集群,并开启账号密码

架构图 部署 一、准备yml文件、nacos sql初始化文件、nginx.conf文件 nacos sql初始化文件/** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in complian…

Flutter QQ聊天项目(1):登录界面实现

下面介绍 Flutter 最基本的通用项目框架搭建,顺便实现一个 QQ 聊天界面,这里只先实现了 QQ 登录界面。先看下效果图:一、运用技术编辑器:VS Code 框架技术:Flutter3.104 + Dart3.105 路由/状态管理:get^4.6.6更具体的:使用ScreenUtilInit自适应界面大小; 使用Stack支持…

PrivHunterAI:越权漏洞检测的工具

免责声明: 工具仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。信息及工具收集于互联网,真实性及安全性自测!!​ 项目介绍 功能 一款通过被动代理方式调用Kimi、DeepSeek和通义千问AI,实现越权漏洞…

开启科创服务新篇章!八月瓜科技CRM数字化管理系统成功上线

近日,北京八月瓜科技有限公司(以下简称 “八月瓜科技”)与纷享销客达成深度战略合作,成功部署并上线CRM数字化管理系统。此次合作是八月瓜科技在数字化转型进程中的重要里程碑,标志着其在科技创新服务领域的数字化变革进程中迈出了坚实且具有战略意义的一步。 八月瓜科技是…

Feedalyze - 让你听得见、听得清用户的反馈

Feedalyze - 专注于用户反馈的管理分析工具,让你听得见、听得清用户的反馈!满足用户需求,解决用户问题,获得适当报酬是商业成功最为重要的因素。然而扪心自问,当您推出新产品后,您真的在听、听得见、听得清用户的反馈么? 当今信息传播迅猛,渠道繁多,优秀产品随口碑效应…

自己写一个下载器,速度堪比IDM下载器

心血来潮,想自己做个下载器,类似于腾讯的游戏高速下载器。类似下图这种,这样又可以接受客户定制喽。开干!解决单文件exe问题这类程序都会利用第三方的下载插件来提升下载速度,但是就会出现多个文件的问题,给人体验感就不好了。利用ILMerge将三方的插件都合并起来,顺利解…

文件下载方法

通用下载1 package com.stig.business.web.contoller;2 3 import com.stig.business.web.mobel.po.EbssFileInfo;4 import com.stig.common.constant.Constants;5 import com.stig.common.properties.BusStopSignProperties;6 import com.stig.common.utils.RedisUtils;7 impor…

Charles安装及使用教程

一. 简介及安装 一、charles的使用 1.1 charles的说明 Charles其实是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的,能够在Windows,Mac,Linux上使用。安装Charles的时候要…