1

私は次のコードを持っています

int main()
{
    int arr[3] = {2, 3};
    char *p;
    p = arr;
    p = (char *)((int*)(p));
    printf("%d, ", *p);
    p++;
    p = (int*)(p+1);
    printf("%d", *p);
    return 0;
}

o / p-2,0

しかし、2番目のprintfで0がどのように出力されているかを知りたいのですが、これらの要素がどのように格納されているかlittle-endianを記憶しているので、次のようにすべてのことを知っています。4 byte integer

00000010 00000000 0000000 00000000 00000011 00000000 00000000 00000000

したがって、最初のprintf回答では2を取得しましたが、2番目printfのポインタはsecond byte0ですが、現在は整数ポインタですが、最大4バイトのメモリをチェックする必要があるため、0を出力しています。最大4バイトのデータ全体。最大4バイトで3バイトになると思いました。

私が欲しいのは、整数データが​​printfによってどのように印刷されているかです。誰でもこれを知ることができます。

4

3 に答える 3

3

ポインタのタイプは、p次の2つのどちらでも変更されませんp = (char *)((int*)(p)); p = (int*)(p+1);

それはまだへのポインタのままcharです。

キャストは、式の値(またはタイプ)を変更するためにのみ機能します。変数から抽出された値のコピーに適用されますが、それらの変数は変更されません。式が終了すると、キャストは関連付けられていた値のコピーとともに削除されます。

例:

signed char c = -1;
int i;
i = (unsigned char)c;

ここでc、-1の値は、タイプに変換/キャストされunsigned charます。charsが8ビットの場合、結果(unsigned char)-1は255であり、この値はタイプunsigned charであり、に変換されてintに割り当てられiます。

c上記のプロセスでは、とにかく変更されません。

例2:

unsigned u = 0x55AA;
unsigned* pu = &u;
unsigned char* pc = (unsigned char*)pu;

puこれは、への型ポインタに変換/キャストされますunsigned char。その変換は変数puを変更せず、その値のコピーを変更するだけです。そしてここでは、ポインタ変数に含まれる実際のアドレスではなく、コピーのタイプを変更するだけです。次に、このアドレスのコピーがに割り当てられpcます。コンパイラは、ここで何が起こっているのか、プログラミングの間違いがあるのか​​どうかを「疑問に思う」すべての権利を持っているため、コンパイラの警告/エラーを回避するためにキャストが必要です。

ここで、pupcは同じ場所、つまり変数の先頭を指しますu。しかし、それらには異なるタイプがあり、1つはを指し、もう1つはを指しunsigned charますunsigned int

したがって、とを逆参照するpupc、異なる値が取得され、それらも異なるタイプになります。

同様に、2つのポインタに対してポインタ演算を行う場合、たとえば、それぞれに1を追加すると、メモリ内の異なる場所を指すように進みます。pu+1の終わりの直後の場所をu指し、の始まりからpc+12番目を指します。unsigned charu

あなたはそれを見始めていますか?

于 2012-10-01T07:43:04.697 に答える
3

基本的な問題は実際にはコードのエラーだと思います。「2番目のprintfの間、ポインタは2番目のバイトにある」と言いますが、これは正しくありません。最初にp++でポインターをインクリメントし(現在は2番目のバイトを指しています)、次にp =(int *)(P + 1)でAGAINをインクリメントし、pを3番目のバイトにポイントさせます。

すべての型キャストを削除してもこのコードの機能はまったく変わらないと私が知る限り、型変換がどのように機能するかを実際には理解していないように思われます。

于 2012-10-01T07:43:20.603 に答える
0

2の場合、「00000010 0000000000000000000000」として格納されていると思います。pはcharポインタであるため、pを増やすと、pが2バイト進むことを意味します。また、コードの場合、'p =(int *)(p + 1)、pが1増加すると、pはcharポインターになります。したがって、p + 1の後、pは'0000000000000000'を指します。したがって、2番目のprintfは0を出力します。

于 2012-10-01T07:55:59.910 に答える