指针递增查询

时间:2010-03-07 07:41:31

标签: c++ visual-studio-2008 visual-studio-2005 pointers math

我一直在看这段代码,但它并没有按照我的预期进行。

我有3个全局变量。

int x, y, *pointer, z;

在主要内部我宣布他们。

x = 10;

y = 25;

pointer = &x;

现在就在这一点

&x is 0x004A144  
&y is 0x004A138  

指针指向0x004A144

现在我增量:

y = *++pointer;

它指向0x004A148,这是应该在的地址y不应该吗?

这个想法是将指针递增到'x'应该将它增加到指向
在y,但它似乎不想像我期望的那样按顺序声明它们 如果这是VS2005 / 2008的问题?或者也许是Express问题?
这不是真正的功课,正如我几年前所做的那样,但是我正在修改我的指针,我再试一次。但这次我得到了意想不到的结果。有人对此有意见吗?

* UPDATE
抱歉应该更清楚,声明'y'上的'思考'应该是148,并且指针指向x的指针应该将'指针'递增到148(它确实如此),但这不是y所在的位置。为什么不宣布它应该在哪里。

3 个答案:

答案 0 :(得分:7)

整个想法确实存在问题。你不能有意义地使用指针通过递增和递减从一个变量“跳转”到另一个变量。这是一个奇怪的,丑陋的,毫无意义的黑客,语言无法保证这一点。

C / C ++中的指针算法仅在数组中定义。所以,如果你想要这样的东西,而不是xy声明一个2个整数的数组

int xy[2] = { 10, 25 };

初始化指针

int *pointer = &xy[0];

然后您可以通过递增和递减xy[0]来尽可能多地在xy[1]pointer之间跳转。

答案 1 :(得分:4)

没有。编译器可以按照自己喜欢的方式自由订购变量x, y, pointer and z。 ++指针保证最终指向y,并且根据我的经验不太可能在实践中。按照与其声明不同的顺序布置变量似乎很常见。

解除引用++pointer是未定义的行为。

如果你需要x和y在内存中是顺序的,那么你应该声明一个包含2个int而不是单独变量的数组。

如果您的编译器支持某种#pragma pack来控制结构打包,那么我建议您将松散的全局变量转换为结构以保证排序。

答案 2 :(得分:3)

  

它指向0x004A148,这是应该在的地址y不应该吗?

没有。 y的地址仍为0x ... 138。操作y = *ptr 将<{1}}指向的内容复制到ptr。没有地址被更改。

(此外,y的地址仍为144,因为x仅影响++,初始化时恰好值为144。

以图形方式,在初始化时,

pointer

138 (y): 25 13c -1 140 -2 144 (x): 10 <- pointer 148 -3 之后,

++pointer

然后你解除引用( 138 (y): 25 13c -1 140 -2 144 (x): 10 148 -3 <- pointer ):

*

然后此值复制到 138 (y): 25 13c -1 140 -2 144 (x): 10 148 -3 <- pointer (*pointer = -3) y):

y = ...

现在 138 (y): -3 <====== copy ========. 13c -1 \ 140 -2 | 144 (x): 10 | 148 -3 <- pointer (*pointer = -3) 仍为144,&x仍为138,&y为148,但包含的值pointer从25更改为某个未知值( - 3)。