首页 > 解决方案 > 当您将内存地址传递给具有指针传递参数的函数时会发生什么?

问题描述

我正在学习 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]改变了。为什么?

标签: c++

解决方案


索引数组本质上是添加然后取消引用。所以,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语句)。


推荐阅读