为什么您可以在不使用任何引用或指针的情况下修改函数内的数组[重复]

2023-12-05

我不明白为什么你可以改变数组内的值,而不使用引用或指针(&,*),我是一名新生,我不知道背后的原因,我希望有人可以提供一个合乎逻辑的答案,请参考下面的代码,提前谢谢您。

#include <iostream> 

using namespace std;

void a(int x[]){
    for(int i = 0; i < 5; i++){
        x[i] += 2;
    }
}
int main(){
    
    int x[5] = {1,2,3,4,5};
    a(x);
    for(auto b : x){
        cout << b << " ";
    }
    
    return 0;
}

在 C++ 中,函数参数从来都不是数组。当您将函数参数声明为数组时,它会自动adjusted是指向此类数组元素的指针。这些声明实际上是相同的:

void a(int x[]);     // looks like an array of int of unknown bound
void a(int* x);      // declaration above is adjusted to this
void a(int x[1234]); // the size is ignored completely

数组隐式转换为指向数组第一个元素的指针(这种转换称为衰减)。因此,您可以通过传递数组参数来调用不接受数组参数的函数:

int* ptr1 = x;     // implicit conversion
int* ptr2 = &x[0]; // same conversion explicitly
a(x);              // same conversion happens here

这两个规则(函数参数调整和数组到指针衰减)使得语法上看起来像按值传递数组的操作实际上是使用间接完成的。在函数内,您可以通过指向函数外部存在的数组的指针参数间接修改元素。


重要提示:函数参数中数组到指针的调整不适用于其他上下文。数组和指针是具有不同属性的不同类型。

另请注意:此调整不适用于复合类型的部分。例如,“指向数组的指针”类型的函数参数不会被调整为“指向指针的指针”,“对数组的引用”也不会被调整为“对指针的引用”。

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

为什么您可以在不使用任何引用或指针的情况下修改函数内的数组[重复] 的相关文章

  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • 如何在 C++ 中从模板基类的构造函数调用模板超类的构造函数?

    我正在使用 sublimetext3 用 c 进行编程 我的程序有一个名为 Array 的超类和一个名为 IntArray 的子类 这两个类都是模板类 目前 我在编译该程序时遇到问题 它不断在我的 IntArray cpp 文件中给出错误
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与

随机推荐

  • 如何“重新启动”应用程序 ios

    我有一个应用程序 用户可以通过 3 个视图控制器 然后向 Facebook 提交图片 在他们将其提交给 Facebook 后 我希望他们能够选择重新启动该流程 就像他们重新启动了该应用程序一样 我怎么能这样做呢 thanks 好的 因为您还
  • python 中具有多个条件的 out 文件?

    鉴于 infile 包含 aaaaaaa pic01 jpg bbbwrtwbbbsize 110KB aawerwefrewqa pic02 jpg bbbertebbbsize 100KB atyrtyruraa pic03 jpg b
  • BitmapImage DecodePixelWidth 奇怪的行为

    在显示大量图像时 我遇到了一些性能问题 我发现问题在于 当我实际上只需要小于 1 4 大小的图像时 却使用了全分辨率图像 因此 我在 BeginInit 和 EndInit 之间添加了一行 将 DecodePixelWidth 设置为 20
  • 尝试拆分数字但列表索引超出范围

    这段代码的问题在于它会到达某个点 在第 9 行 如果 a c 1 0 它会调用一个不存在的索引 3 并给出错误 列表索引超出范围 a 555101 a list map int a c 0 seq for i in a if a c 1 i
  • SAS 安全列名称(更新)

    SAS 中是否有一种简单的方法可以将字符串转换为 SAS 安全名称以用作列名称 ie Rob Penridge gt Rob Penridge Blah gt Blah 我正在使用一个proc transpose然后想要在转置后使用重命名的
  • 如果不使用访问标识符,会调用什么方法?

    我不知道没有访问标识符的方法被称为什么 在此代码块中 我指的是void updateNumTo5 method private int num 0 region public methods public int Get7 return 7
  • 暂停 Windows 窗体的重画

    我有一个窗口窗体 它包含几个数据网格视图 在某些时候 用户可以按下更新数据网格视图的按钮 当他们这样做时 他们通常可以坐下来观看 datagridview 重新绘制 一次一行 我希望控件在 完成 之前不要绘制 也就是说 我想要一种方法来告诉
  • 将旧版 VB6 函数调用转换为 .NET 的实用程序 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个实用程序 工
  • 可滚动 Div 内带有固定标题的大型 HTML 表。如何?

    这个问题已经困扰我一段时间了 以下是同一页面中的两个固定标题 html 表 Site 1 https datatables net release datatables extras FixedHeader two tables html
  • 删除分支中的目录会导致主服务器中的目录在交换机上被删除吗?

    在我的 git repo master 分支中 我有工作目录 tmp repo name secret code 如果我切换到名为 test 的新分支 然后rm rf secret code 当我改回master时 它也会从那里删除secr
  • 实体框架 4 - 具有“IS NULL”鉴别器的功能 CTP5 中的 TPH 继承(代码优先)

    大家好 我正在尝试在层次结构上创建 TPH 映射 其中区分子句是经典的 IS NOT NULL IS NULL 情况 这是数据库方面的示例 CREATE TABLE info EducationTypes ID INT NOT NULL P
  • 如何在 Windows Azure 网站上获取 System.Speech?

    我已将文本到语音合并到一个 asp net webforms 应用程序中 该应用程序在本地运行时工作正常 然而 当我部署到天蓝色网站时 处理 System Speech 时似乎发生了空引用 我尝试将 Webforms 应用程序发布到 azu
  • IBM Mobile First - Json Store 无法在 Samsung Galaxy S6 上运行

    我们正在使用 IBM Mobile First Platform 7 0 为 iOS 和 Android 平台构建一个混合应用程序 我们使用 JSONStore 来保存用户非机密数据 我们不会对存储的数据进行加密 当我们将应用程序部署到 S
  • 我可以重新排序现有的 XML 以遵守 XSD

    我们正在使用 Java 生成 XML org w3c dom Node 本质上使用 parent appendChild doc createElement nodeName 这会生成一个 XML 其中节点按调用 appendChild 的
  • 如何从c函数rand()中获得更大的随机数

    我所处的编码环境只能访问一些最基本的 C 函数 include ing 其他库是不可行的 在这种环境中 我可以调用 rand 它在我的环境中为我提供 0 到 32767 之间的随机数 我认为 下面的代码是否是获得像 rand 这样均匀分布的
  • Python 中的 % 语法 [重复]

    这个问题在这里已经有答案了 我正在做一个项目 我必须在其中编写 matplotlib inline 一开始是为了解决一个问题 但我想知道这个 代表什么 它是一个运算符吗 它有一个名字吗 以便我可以对其进行一些研究 您查看的不是标准的 Pyt
  • C# 中的 UDP“连接”速度

    我分析了一些样板 UDP 代码 对于仅发送一些少量数据 这是我的意图 速度非常好 但是与 发送 方法相比 连接 方法 非常慢 这需要 50 80 毫秒 udpClient new UdpClient udpClient Connect HO
  • 使用 -d 标志时 mongorestore 需要什么样的文件或目录?

    我想使用mongorestore命令 但我无法准确理解它正在寻找什么样的输入 使用后mongodump命令 我最终得到这棵树 mydirectory dump mydb1 schemas bson schemas metadata json
  • 从 NSDictionary 返回 NSArray

    我有一个返回一个数组 其中包含核心数据对象属性的字典 这是我之前的问题 从 NSFetchResultsController 的 NSObject 属性创建数组 这是获取 NSFetchRequest request NSFetchRequ
  • 为什么您可以在不使用任何引用或指针的情况下修改函数内的数组[重复]

    这个问题在这里已经有答案了 我不明白为什么你可以改变数组内的值 而不使用引用或指针 我是一名新生 我不知道背后的原因 我希望有人可以提供一个合乎逻辑的答案 请参考下面的代码 提前谢谢您 include