我一直在看这段代码,但它并没有按照我的预期进行。
我有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所在的位置。为什么不宣布它应该在哪里。
答案 0 :(得分:7)
整个想法确实存在问题。你不能有意义地使用指针通过递增和递减从一个变量“跳转”到另一个变量。这是一个奇怪的,丑陋的,毫无意义的黑客,语言无法保证这一点。
C / C ++中的指针算法仅在数组中定义。所以,如果你想要这样的东西,而不是x
和y
声明一个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)。