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

标签 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。 (这里我也不确定,因为我将 printf() 与 %i 一起使用,并且收到了关于此的警告。)

我不太确定这是如何工作的。我有一些理论,但我更喜欢阅读一些相关文档。

有人可以给我一个关键词来搜索或向我解释这三种情况下的确切行为吗?由于缺少搜索词,我无法在 SO 或 google 上找到有关此事的信息。

当我输入时输出会改变

int16_t *a = 1;
int32_t *b = (int16_t*)(a + 1);
int64_t *c = (int32_t*)b + 2;

相反?

最佳答案

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

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

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

之后,您烘焙 b 一个 uint32_t * 并添加 2,因此实际上您添加了 2*4 ,从而得到 make b 指向 10 (0xA)

如果您执行上述更改,您的 a 会指向 1 (和 2,因为它有 16 位),并添加 1 将使 b 指向 3 (和 4)(那里不需要强制转换),并且 c 将指向 3+2*4 = 11。

关于转换并添加指向不同大小类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089145/

相关文章:

C、free() 和指针运算

c - 哈希表删除方法

ios - C FOpen() 打开文档目录 iOS

c++ - 如果你知道地址,你能访问另一个程序的堆栈/堆吗?

c - 指向结构的指针数组,调试时只有 SIGSEGV

c++ - C++ 中指针运算的 a+i 和 &a[i] 有什么区别?

c - 如何在 Solaris 上设置输入队列的动态大小?

从 char 函数中删除 printf 后的 C : Program prints weird stuff in output,

c++ - "ptr = ptr -> next"这个"->"是什么意思? (C++)

c++ - 指针算术递增后缀/前缀