转换和添加指向不同大小的类型的指针

时间:2012-10-26 14:45:48

标签: c pointers pointer-arithmetic

假设我有以下代码段:

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;

代替?

2 个答案:

答案 0 :(得分:3)

我认为你的整个程序是未定义的行为,因为我不确定将任意值放入指针变量或用%i输出它们是否有效。

那就是说,我认为大多数环境都可以,所以我想我可以开始解释了。

如果a1,则(未对齐)指向内存地址1。 然后添加1,使其指向2,并将结果转换为b

之后,您烘焙b一个uint32_t *并添加2,这样您就可以有效地添加2*4,从而使b指向10 (0xA)。< / p>

如果您执行上述更改,则a指向1(和2,因为它有16位),添加1b }指向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