给定的代码
int arr[12];
int * cur = arr;
cur++;
cout<<"cur-arr = "<<cur-arr<<endl;
输出1
,但我预计sizeof(int)
。有人可以解释这种行为的性质吗?
给定的代码
int arr[12];
int * cur = arr;
cur++;
cout<<"cur-arr = "<<cur-arr<<endl;
输出1
,但我预计sizeof(int)
。有人可以解释这种行为的性质吗?
cur
是一个指向int
,初始化为某个值(arr
- 阵列到指针转换的语义无关这里),递增(cur++
)和比其旧的值。毫不奇怪,它通过增量操作增长了一个。
给定类型的指针运算就像常规算术一样工作。虽然在本例中指针前进sizeof(int)
字节,但指针之间的差异也是以sizeof(int)
为单位计算的,所以你会看到简单的简单算术。
这并不完全*递增*,指针本身不会增长一个。它由'sizeof(int)'增长,但指针减法运算符返回**元素**中的差异,而不是以字节为单位。 – ulidtko 2012-01-04 17:01:30
@ulidtko:这并不重要。当你考虑抽象时,即使基础值增加超过'(int)1',它当然也是一个增量。 – 2012-01-04 17:07:08
这是arr
和cur
(在相减时为arr+1
)之间的元素数(int
s)。编译器注意到cur
是一个指向整数的指针,而arr
是一个整数数组。要获得总字节数,请尝试以下操作:
(cur - arr) * sizeof(arr[0]);
这是C指针算术的定义行为。它使用指向类型的大小作为单位。如果你在最后一行中减去
(char *)cur - (char *)arr
你在输出中得到4。
这将是'char *'。你无法对'void *'进行算术运算。 – 2012-01-04 17:23:38
一些编译器确实允许'void *'算术。 char *'肯定更好。 – ugoren 2012-01-04 19:40:48
指针的加法和减法按照指针类型工作。
你对此不甚了解?你在期待什么? – Mat 2012-01-04 16:56:57
你认为'cur ++'有什么作用? – 2012-01-04 16:57:18
这是[指针算术](http://stackoverflow.com/questions/394767/pointer-arithmetic)。 – ulidtko 2012-01-04 16:57:18