c++ - 当您将内存地址传递给具有指针传递参数的函数时会发生什么?
问题描述
我正在学习 C++ 并且在这部分中对以下问题感到困惑:
以下程序的输出是什么?
#include <iostream>
using namespace std;
void displayArray(const int A[], const int no){
for (int i = 0; i < no; i++)
cout << A[i] << "\t";
cout << endl;
}
void modifyArray(int *arr, int index){
arr[index] = arr[0] + 10;
}
int main(){
int B[] = {1,2,3,4,5,6,7,8};
displayArray(B,8);
displayArray(B+3,4);
modifyArray(B,2);
modifyArray(B+5,1);
modifyArray(&(B[3]),4);
displayArray(B,8);
return 0;
}
我能够让它们正确,除了带有modifyArray(&(B[3]),4);
.
当我们尝试传递 to 的“地址”时会发生B[3]
什么void modifyArray(int *arr, int index)
?
结果,我看到 at 的值B[3]
没有改变,而是B[7]
改变了。为什么?
解决方案
索引数组本质上是添加然后取消引用。所以,arr[i] == *(arr + i)
。因此,&b[3] == &(*(b + 3))
这只是b + 3
. 由于数组是连续的内存块,因此这只是一个以 3 个元素开头的数组,或{4, 5, 6, 7, 8}
. 因此,该数组的索引 4,即原始数组的索引 7,设置为该数组的索引 0 加上 10。因此,b 将是{1, 2, 3, 4, 5, 6, 7, 14}
(如果您摆脱其他modifyArray
语句)。
推荐阅读
- python - 错误:文件不存在并且没有这样的文件或目录python
- android - 如何在 Kotlin 中将 API BEGIN_ARRAY 更改为 BEGIN_OBJECT?
- windows - 在非交互模式下运行 windows reg add 命令
- r - 将ggplot2中的图例与拼凑组合并合并
- python-3.x - 计算矩阵之间的损失
- reporting-services - SSRS 在钻取子报表上显示工具栏
- python - 如何通过名称/ID而不是设备索引读取OpenCV相机?
- wordpress - WordPress:BuddyPress:只允许一个电子邮件域注册
- java - 如何将 json 对象数组反序列化为 json 字符串数组?
- c# - 如何在 .Net Framewokr 4.7.2 的 Web 服务 C# 中配置 TLS1.2?