C ++中的平均指针位置

时间:2013-06-24 07:09:57

标签: c++ pointers memory-address

我正在摆弄指针,例如,代码:

int foo = 25;
int * bar = &foo;
cout << (unsigned long int) bar;

在我运行时输出3216952416左右的内容。

那么为什么这个代码在运行时会输出如此低的数字,甚至是负数呢?

int total = 0, amount = 0;

for( int i = 0; i < 100000; i++ )
{
    int foo = 25;
    int * bar = &foo;

    total += (unsigned long int) bar;
    amount++;
}

cout << "Average pointer position of foo: " << total / amount << endl;

这可能很简单...

2 个答案:

答案 0 :(得分:1)

首先,变量地址(指针的值)是无符号的。您使用有符号整数进行计算。它解释了范围发生了变化,并且可能出现负值。其次,当你使用

时,你肯定会溢出
total += (unsigned long int) bar;

,所以任何价值都是可能的。

您的演员表无用,因为总计类型为int。将会执行另一个隐式演员。

您可以尝试将total的类型更改为unsigned long int,但这还不够。为了避免溢出, 你需要做比率的总和,而不是和的比率

double amount = 100000;
double average= 0;

for( int i = 0; i < amount; i++ )
{
    int foo = 25;
    int * bar = &foo;

    average += (((unsigned long int) bar)/amount);
}

cout << "Average pointer position of foo: " << (unsigned long int)average << endl;

答案 1 :(得分:1)

int无法存储无限大的数字。当total变得太大而无法存储在int中时,该值会回绕到int范围的另一边。

在大多数系统上,使用32位内存保存int变量。这使它的范围为-2147483648到2147483647。

如果您的int已经拥有值2147483647并且您添加1,则结果为-2147483648!

因此,如果您想计算&#34;平均指针值&#34;,您需要将您的总和存储在比int大得多的数据中,或者进行计算以使您不必需要存储所有指针值的总和(例如,UmNyobe&#39;答案)。