2017-08-30 81 views
3

我对int数组到char*的转换有疑问。以下代码的输出为23。但我不明白为什么。有人可以向我解释吗?C - int数组到char *转换

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 

int main(){ 
    uint32_t x; 
    uint32_t* p = (uint32_t*) malloc(sizeof(uint32_t));  
    uint32_t array[9] = {42, 5, 23, 82, 127, 21, 324, 3, 8}; 

    *p = *((char*)array+8); 
    printf("1: %d\n", *p); 
    return 0; 
} 
+1

[指针运算的可能的复制(char \ *)&a \ [1 \] - (char \ *)&a \ [0 \] == 4](https://stackoverflow.com/questions/20486661/pointer-arithmetic-char-a1-char- a0-4) –

回答

6

uint32的大小是32位或4个字节。当您执行(char*)array+8时,您将数组转换为char数组,并取第八个字符。在这里,第八个字符包含整数23的整数的开头,它适合char。

3

如果你仔细想想,你已经将数组铸造成char*。 char size是1B。 这意味着在这种情况下使用指针算术+8不会将您8*sizeof(uint32_t)移动到第九个元素的数组,但只有8字节(8*sizeof(char))。

由于uint32_t有4个字节,你已经移动到第三元件23

首先第一个字节,你必须在uint32_t阵列和铸造它为char后使用指针算术,像

*p = (char)*(array+8); // Prints 8 
4
*p = *((char*)array+8*sizeof(uint32_t) 

移动到阵列[8] 在您的示例你只移动8个字节向前