C ++:用于循环打印地址的数组而不是值

时间:2012-03-29 23:36:17

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

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

int num[29];是一个为29个整数留出29个地址的数组-i得到那个部分,但是在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;
}

2 个答案:

答案 0 :(得分:8)

打印地址的原因是

(num+i)

是数组的i元素的地址,而不是i元素本身的地址。如果您想获得i元素,可以编写

*(num + i)

或者,甚至更好:

num[i]

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

希望这有帮助!

答案 1 :(得分:3)

声明如:

int num[29];

定义了一个包含29个整数的连续数组。

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

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

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

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

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

表达式*ptr给出了一些指针ptr指向的对象。

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

因此num[5]*(num+5)

相同

num+5&num[5]

相同

num&num[0]

相同

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

打印对象时,它将打印对象的值。

所以

cout << num + 5;

将打印num

的第5个(零索引)元素的地址

cout << num[5];

将打印num

的第5个(零索引)元素的值