使用指针的数组增量,同时保持指针地址不变

时间:2013-10-21 01:23:03

标签: c++ c arrays pointers

我正在学习期中考试,其中一个问题是以下哪个语句会增加数组中的值,并保持指针地址不变?圈0或更多。

int array[10];
int * ptr = array;

1)*ptr++;

2)(*ptr)++;

3)*++ptr;

4)++*ptr;

我之前看过1和2,我相信它只是在不改变指针的情况下得到取消引用的值。但我很惊讶地发现3和4实际上是有效的,我很困惑如何理解甚至阅读它?这是一回事吗?我相信答案是所有4个都是有效的。

2 个答案:

答案 0 :(得分:2)

http://en.cppreference.com/w/cpp/language/operator_precedence会对您有所帮助。仔细阅读它并根据运算符的优先级将括号括在示例中,所有内容都会有所帮助。

例如,第一个将成为*(ptr++)

答案 1 :(得分:1)

每个C ++表达式都会产生一个值(主效应)。也可能存在之前发生的副作用(如上例所示)(例如,预增量) 实施例3和4)或之后(例如实施例1和2中的后增量)主要效果。所以在你的例子中:

1)副作用发生在最后:

主要效果:取消引用ptr获取数组[0]

副作用:将增量ptr增加4个字节(在32位机器上)

2)副作用发生在最后:

主要效果:取消引用ptr获取数组[0]

   副作用:后增量* ptr(= array [0])乘以1

3)首先出现副作用:

副作用:预增加ptr 4个字节(在32位机器上)

   主效果:取消引用* ptr得到数组[0]

4)首先发生副作用:

副作用:预增量* ptr(= array [0])乘以1

   主效果:取消引用* ptr得到数组[0]

请注意,通过忽略副作用运算符(++)可以获得主效果,因此在所有情况下都是相同的。主要影响通常与分配相结合,如:

int y = *++ptr;    // ptr is incrented to point at array[1] and then y becomes equal to *ptr (= array[1])