【问题标题】:Passing an array to a function as a pointer将数组作为指针传递给函数
【发布时间】:2015-07-01 15:29:13
【问题描述】:

我在学习 C++ 的时候,偶然发现了这段代码:

int &get(int *arry, int index) { return arry[index]; }
int main() {
    int ia[10];
    for (int i = 0; i != 10; ++i)
        get(ia, i) = i;

我的问题是,它是如何工作的?

arry 是指针,这怎么可能?

【问题讨论】:

  • 你有a good C++ book 吗?
  • @PaulR 我正在阅读 C++ Primer 5th Edition
  • Prata 书籍一直非常出色,恕我直言。
  • 好的 - 阅读指针和引用并尝试理解其中的差异。
  • operator[] 取消引用指针。基本上把它当作*(arry+index)

标签: c++ arrays


【解决方案1】:

内置的[] 语法实际上作用于指针。在数组上使用它时,数组首先将decayed 转换为指向其第一个元素的指针,然后对其进行索引。

在您的示例中,当您将数组作为参数传递给函数时,数组会衰减。这里没有数组引用。

【讨论】:

    【解决方案2】:

    在 C++ 中,您可以将数组--in this situation--视为指向该数组中第一项的指针,其中数组中的所有项在内存中一个接一个地排列:

     _____
    |  6  |   <-- ai
    |  9  |
    |  4  |
    |__2__|
    

    那么,*ai 应该产生 6

    *(ai+1) 应该是9 等等......(事实证明,ai[x]syntactic sugar 因为--它直接转换为--*(ai+x)

    当你传入数组时,你只是传递了一个指向第一项的指针。然后该函数返回arry[index] 通过引用的值。这意味着如果我们改变返回值,我们实际上是在改变arry[index],我们知道它是ia[i]

    这有意义吗?

    【讨论】:

      【解决方案3】:

      设数组 a[10] 的基地址为 1000。因此,如果要访问数组 a 的索引 2 中的元素,则写入 a[2]。根据编译器对这条语句的解释是:

      a[2]= 1000 + (2 * 2) = 1004

      因此您可以通过公式访问任何元素:

      a[index]= base_address + (sizeof datatype * index no)

      现在,回答您的问题,当您在您的情况下仅提供数组的名称时,如 ai 中的那样,您实际上是在传递数组的基地址。这就是您在函数参数中使用指针符号的原因。int *arry, int index

      您必须了解以下内容:

      int a,*b,c;
      a=8;
      b=&a;
      c=*b;
      

      当你打印 c 时,你会得到 8。

      因此,如果 index 为 2,则 arry[index] 行被解释为:

      (base_address) + (sizeof int * 2)

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2017-04-18
        • 2013-02-15
        • 1970-01-01
        • 2016-07-17
        • 2012-11-23
        • 2017-06-29
        • 2016-03-27
        相关资源
        最近更新 更多