【问题标题】:C++: array for loop printing addresses instead of valuesC ++:用于循环打印地址而不是值的数组
【发布时间】:2012-03-29 23:36:17
【问题描述】:

这是在课堂上给我们的一个例子。有人可以向我解释为什么这会打印 29 个地址而不是 29 个“0”(零)吗?

int num[29]; 是一个数组,它为 29 个整数预留了 29 个地址 - 我得到了那部分,但是在 for 循环中你不是打印这些地址中的值而不是地址本身吗?

另外,(num+i) 和 (num[]+i) 有什么区别?

我有点困惑..

#include <iostream>
#include <cmath>

using namespace std;

int main(){
    int  num[29];
    for (int i=0;i<29;i++)
        cout << (num+i) << endl;

    return 0;
}

【问题讨论】:

    标签: c++ arrays for-loop memory-address


    【解决方案1】:

    打印地址的原因是

    (num+i)
    

    是数组的ith 元素的地址,而不是ith 元素本身。如果要获取ith 元素,可以这样写

    *(num + i)
    

    或者,甚至更好:

    num[i]
    

    至于您的第二个问题 - 语法 (num + i) 表示“地址 i 对象超过 num 的开头,语法 (num[] + i) 不是合法的 C 或 C++。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      声明,例如:

      int num[29];
      

      定义一个由 29 个整数组成的连续数组。

      要访问数组的元素,请使用num[i],其中 i 是索引(第一个元素从 0 开始)。

      表达式num 自己给出了数组第一个元素的指针(内存地址和类型)。

      表达式ptr + i(其中 ptr 是一个指针,i 是一个整数)的计算结果是一个指针,它位于 ptr 之后的 i 个位置(以指针类型为单位)。

      所以num + i 给出了一个指向索引为 i 的元素的指针。

      表达式&amp;a 给出了一个指向某个对象a 的指针。

      表达式*ptr 给出了某个指针ptr 所指向的对象。

      所以表达式a 和*(&amp;a) 是等价的。

      所以num[5] 与*(num+5) 相同

      而num+5 与&amp;num[5] 相同

      而num 与&amp;num[0] 相同

      当你用 cout 打印一个指针时,它会显示它的地址。

      当您打印一个对象时,它将打印该对象的值。

      所以

      cout << num + 5;
      

      将打印 num 的第 5 个(零索引)元素的地址

      和

      cout << num[5];
      

      将打印 num 的第 5 个(零索引)元素的值

      【讨论】:

        猜你喜欢
        • 2021-12-10
        • 1970-01-01
        • 2014-05-17
        • 2016-02-26
        • 2011-04-10
        • 1970-01-01
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多