2017-08-30 80 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個字節向前