2017-08-30 29 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の配列にキャストされ、8番目の文字が使用されます。ここでは、8番目の文字には整数23の先頭が含まれ、charに収まります。

3

考えてみると、配列はchar*にキャストされています。 sizeof charは1Bです。 これは、この場合の使用ポインタ演算子を意味します+88*sizeof(uint32_t)は配列のnineth要素に移動しませんが、8バイト(8*sizeof(char))だけです。

uint32_tは4つのバイトを持っているので、あなたが

*p = (char)*(array+8); // Prints 8 
4
のように、 uint32_tアレイ上のポインタ算術演算を使用し、そのキャストの後にそれがcharに持っている第三要素の最初のバイト23

まずに移動しました

*p = *((char*)array+8*sizeof(uint32_t) 
は、アレイに移動し、[8]あなたの例では あなただけの8バイト[ポインタ演算の前方

関連する問題