2012-01-04 46 views
-1

可能重复:
Pointer Arithmetic差的两个地址用C

给定的代码

int arr[12]; 
int * cur = arr; 
cur++; 
cout<<"cur-arr = "<<cur-arr<<endl; 

输出1,但我预计sizeof(int)。有人可以解释这种行为的性质吗?

+1

你对此不甚了解?你在期待什么? – Mat 2012-01-04 16:56:57

+0

你认为'cur ++'有什么作用? – 2012-01-04 16:57:18

+0

这是[指针算术](http://stackoverflow.com/questions/394767/pointer-arithmetic)。 – ulidtko 2012-01-04 16:57:18

回答

2

cur是一个指向int,初始化为某个值(arr - 阵列到指针转换的语义无关这里),递增(cur++)和比其旧的值。毫不奇怪,它通过增量操作增长了一个。

给定类型的指针运算就像常规算术一样工作。虽然在本例中指针前进sizeof(int)字节,但指针之间的差异也是以sizeof(int)为单位计算的,所以你会看到简单的简单算术。

+0

这并不完全*递增*,指针本身不会增长一个。它由'sizeof(int)'增长,但指针减法运算符返回**元素**中的差异,而不是以字节为单位。 – ulidtko 2012-01-04 17:01:30

+0

@ulidtko:这并不重要。当你考虑抽象时,即使基础值增加超过'(int)1',它当然也是一个增量。 – 2012-01-04 17:07:08

3

这是arrcur(在相减时为arr+1)之间的元素数(int s)。编译器注意到cur是一个指向整数的指针,而arr是一个整数数组。要获得总字节数,请尝试以下操作:

(cur - arr) * sizeof(arr[0]); 
4

这是C指针算术的定义行为。它使用指向类型的大小作为单位。如果你在最后一行中减去

(char *)cur - (char *)arr 

你在输出中得到4。

+1

这将是'char *'。你无法对'void *'进行算术运算。 – 2012-01-04 17:23:38

+0

一些编译器确实允许'void *'算术。 char *'肯定更好。 – ugoren 2012-01-04 19:40:48

1

指针的加法和减法按照指针类型工作。