修改C++函数中指针指向的位置

2024-01-11

我一直在修改指针的指针上陷入困境。问题是我不明白为什么我的代码有效。我想做的是修改函数中指针指向的位置。然后在我的主函数中访问该值。我尝试了很多次,这是我让它发挥作用的唯一方法。

#include <iostream>
using namespace std;
void changePP(int **ppint) {
    int *n = new int;
    *n = 9; //just a value for demonstration purposes
    *ppint = n; //THE LINE IN QUESTION
    delete n;
}
int main() {
    int **ppint = NULL;
    int *p = new int;
    *p = 4; //another value for demonstrating
    ppint = &p;
    cout << **ppint << endl;
    changePP(ppint);
    cout << **ppint << endl;
}

因此,输出是 4,然后是不同行上的 9。但是,我不确定这条线*ppint = n在代码中。为什么我必须使用*更改指针指向的位置在changePP函数中而不是在main中?另外为什么我不必使用&在函数中?我似乎无法在互联网上找到我可以理解的解释,我想知道是否有人可以为我解释一下?


注意:这些内存地址仅供说明之用。

内存布局

0x0A | 4
0x0B | 'p' -> 0x0A // Pointer to the value 4 in location 0x0A
0x0C | 'ppint' -> NULL // Initially a null pointer

表演ppint = &p;产生以下结果,因为这里ppint指针位于0x0C.

0x0A | 4
0x0B | 'p' -> 0x0A
0x0C | 'ppint' -> 0x0B

至于参数中changePP函数,我将其称为ppintCopy为了减少混乱。它是一个副本(即,一个不同于ppint)并且修改它只会修改副本。

0x0D | 'ppintCopy' -> 0x0C // A pointer that points to `ppint`

表演ppintCopy = &n会修改指针0x0D这不是指针的位置main功能。However, 取消引用ppintCopy (i.e., *ppintCopy) 产量0X0C这是来自的指针main因此函数*ppintCopy = n;正在改变指针的位置0x0C points.

为什么我必须使用*来更改changePP函数中指针指向的位置,而不是在main中?

通过上面的插图,我希望更清楚它为什么起作用main以及为什么你必须在中使用不同的语法changePP功能。

另外为什么我不必在函数中使用 & ?

In the main函数变量ppint属于类型int**(即指向指针的指针)和p属于类型int*。你不能执行ppint = p;因为它们是不同的类型。如果您删除一层间接,可能会更容易看到这一点。例如:

int* pMyInt = NULL;
int myInt = 3;

我认为这是不言自明的,这是行不通的(即,它们是不同的类型)。

pMyInt = myInt;

但是您可以获取以下地址myInt使用&运算符产生一个指向 int 的指针(即int*)并且由于该类型与pMyInt现在可以进行任务了。

pMyInt = &myInt;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改C++函数中指针指向的位置 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • tabControl 中的关闭按钮

    有没有人可以告诉我如何在 C 中使用 tabControl 在每个选项卡中添加关闭按钮 我计划使用按钮 pic 来替换我的选项卡中的 x 谢谢 无需派生类 这里有一个简洁的片段 http www dotnetthoughts net imp
  • 如何获取 AMP 网站上的查询字符串值?

    有没有办法从 AMP HTML 网站检索查询字符串值并将它们存储在 cookie 中或在链接中使用它们 Example 用户点击广告www example com amp foo bar 打开 AMP 网站 点击链接即可结帐 不是 AMPw
  • HTML 客户端可移植文件生成 - 无需外部资源或服务器调用

    我有以下情况 我在公司内部服务器上设置了一系列 Cron 作业来运行各种旨在检查数据完整性的 PHP 脚本 每个 PHP 脚本都会查询公司数据库 将返回的查询数据格式化为包含一个或多个
  • 如何在“expect script”中启动shell脚本?

    在这个expect脚本中 不会连接ssh服务器 我只想在本地执行一个 sh 文件 这可能吗 例如 bin expect command xxx sh a command which starts a certain shell script
  • 如何将 varchar 转换/转换为日期?

    我有一个数据类型的日期列varchar mm dd yyyy 在 MySQL 5 1 中 如何将其转换为 DATE 这是我到目前为止所拥有的 SELECT id date FROM tableName WHERE CAST SUBSTRIN
  • 画布圆圈看起来模糊

    这是对一些过时或不同问题的更新 例如 画布上的绘图和线条一样模糊 https stackoverflow com questions 8696631 canvas drawings like lines are blurry 如何修复 HT
  • 如何防止我的应用程序出现多个实例

    我发现了 Visual Basic 中的一个错误 在实践中 完成我的应用程序后 单击正常启动的可执行文件 但如果我再次单击可执行文件 exe 会莫名其妙地打开第二个窗口 不必要地启动两个进程 我想知道是否有一种方法 也许在某些设置中 仅当您
  • Google Sheet 插件 onInstall() 和 onOpen() 不起作用

    我正在尝试为 Google Sheets 创建一个附加组件 但运行时出现问题 该附加组件使用以下命令在 附加组件 菜单中创建附加菜单onOpen Google Drive API 的功能 但它不这样做onInstall 所以我被告知添加以下
  • Chrome 的词典自动完成扩展? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我尝试用谷歌搜索这个 但我没有任何运气 chrome 有拼写自动完成扩展吗 就像在 Eclipse 中输入时一样 System out pri 然后
  • WSDL 函数具有相同的名称。如何选择呢?

    我将提供程序 wsdl 与 SoapClient 一起使用 但是当我使用命令 getFunctions 时 我得到如下内容 method1Rsp service method1Req parameters method2Rsp servic
  • Django 和动态生成的图像

    我的 Django 应用程序中有一个视图 它使用 PIL 自动创建图像 将其存储在 Nginx 媒体服务器中 并返回一个带有指向其 url 的 img 标签的 html 模板 这工作正常 但我注意到一个问题 我每访问此视图 5 次 其中就有
  • 在主题内扩展 Magento 小部件布局

    我使用 Magento 2 的内置目录产品列表小部件将特色产品小部件添加到网站的主页 我希望做的是扩展在中找到的小部件的布局文件vendor magento module catolog widget etc widget xml这样我就可
  • 对于简单到中等复杂度的新项目,我应该选择 MvvmLight 还是 MvvmCross? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我试图找到 MVVMlight 和 MVVMCrossthose 框架之间的主要区别 我计划为 Android 和 Windows Phone
  • 如何将树的结果传递或通过管道传输到Powershell?

    如何通过文件数组找到tree 有人居住吗 posh gt posh gt tree Get Item Directory home nicholas powershell Mode LastWriteTime Length Name d 2
  • css 文件中字体的相对文件路径

    我有一个在标题中引用的样式表 除了以下特定代码之外 所有 css 都可以在其中运行 font face font family icomoon src url fonts icomoon eot hsw0h3 src url fonts i
  • NSDateFormatter 具有自定义格式的相对日期格式

    所以我的目的是列出如下所示的日期 Today August 28 Tomorrow August 29 Friday August 30 etc 问题是我似乎只能如此接近 When I setDoesRelativeDateFormatti
  • Google_Service_OAuth2 是 PHP 中的“未定义类型”

    我正在尝试使用 Google Sign in 登录 但它显示 Google Service OAuth2 为未定义类型 我找到了这个堆栈帖子 Google Service Oauth2 未定义 https stackoverflow com
  • Spark 中的分区和分桶有什么区别?

    我尝试优化两个 Spark 数据帧之间的联接查询 我们称它们为 df1 df2 在公共列 SaleId 上联接 df1非常小 5M 所以我在spark集群的节点之间广播它 df2 非常大 200M 行 所以我尝试通过 SaleId 对其进行
  • BERT 中 NER 的正确格式化数据应该是什么样子?

    我正在使用 Huggingface 的transformers库并希望使用 BERT 执行 NER 我试图找到一个明确的示例 说明如何使用 BERT 正确格式化 NER 的数据 从我发现的论文和评论中 我并不完全清楚 假设我们有以下句子和标
  • 修改C++函数中指针指向的位置

    我一直在修改指针的指针上陷入困境 问题是我不明白为什么我的代码有效 我想做的是修改函数中指针指向的位置 然后在我的主函数中访问该值 我尝试了很多次 这是我让它发挥作用的唯一方法 include