假设我有以下代码段:
int8_t *a = 1;
int16_t *b = (int16_t*)(a + 1);
int32_t *c = (int32_t*)b + 2;
然后a = 1,b = 2,c = 10。 (这里我也不确定,因为我使用了%i的printf()而且我收到了关于此的警告。)
我不太确定这是如何工作的。我有一些理论,但我更喜欢阅读一些关于它的文档。
有人可以给我一个关键词来搜索或解释这三种情况中的确切行为吗?由于搜索不足,我无法在SO或谷歌上找到有关此事的信息。
输入
时输出是否会改变int16_t *a = 1;
int32_t *b = (int16_t*)(a + 1);
int64_t *c = (int32_t*)b + 2;
代替?
答案 0 :(得分:3)
我认为你的整个程序是未定义的行为,因为我不确定将任意值放入指针变量或用%i
输出它们是否有效。
那就是说,我认为大多数环境都可以,所以我想我可以开始解释了。
如果a
为1
,则(未对齐)指向内存地址1
。
然后添加1,使其指向2
,并将结果转换为b
。
之后,您烘焙b
一个uint32_t *
并添加2,这样您就可以有效地添加2*4
,从而使b
指向10 (0xA)
。< / p>
如果您执行上述更改,则a
指向1
(和2
,因为它有16位),添加1
将b
}指向3
(和4
)(那里不需要演员),c
将指向3 + 2 * 4 = 11.
答案 1 :(得分:2)
不是像这样的具体问题,你应该尝试更多地理解语言本身(指针,解除引用等)http://www.cplusplus.com/doc/tutorial/pointers/
为指针赋值就像说这个指针代表地址(值)的内存。
int8_t * a = 1; // a is memory at address 1
int16_t *b = (int16_t*)(a + 1); // b is memory at address (a + 1)... 2
int32_t *c = (int32_t*)b + 2; // c is memory at address 2 + (2 * sizeof(int32_t))... 10