0

変数とポインター、ポインター-ポインター、およびポインター-ポインター-ポインターを格納するために使用されるアドレスのサイズを理解しようとしました。結果はちょっと混乱しています。

コードは次のとおりです。

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

int main(void)
{
    char    *** ppptr_string = NULL;
    int     *** ppptr_int    = NULL;
    double  *** ppptr_dbl    = NULL;

    char c=0; int i=0; double  d=0;

    printf("\n %d   %d   %d   %d   %d\n", sizeof(&ppptr_string),   
    sizeof(ppptr_string),  sizeof(*ppptr_string), sizeof(**ppptr_string), 
    sizeof(***ppptr_string));
    printf("\n %d   %d   %d   %d   %d\n", sizeof(&ppptr_int),   sizeof(ppptr_int),    
    sizeof(*ppptr_int),   sizeof(**ppptr_int),   sizeof(***ppptr_int));
    printf("\n %d   %d   %d   %d   %d\n", sizeof(&ppptr_dbl),   sizeof(ppptr_dbl),    
    sizeof(*ppptr_dbl),   sizeof(**ppptr_dbl),   sizeof(***ppptr_dbl));


    printf("\n  sizeof(char) = %d,   sizeof(int) = %d,   sizeof(double) = %d", 
    sizeof(c), sizeof(i), sizeof(d));
    printf("\n sizeof(&char) = %d,  sizeof(&int) = %d,  sizeof(&double) = %d", 
    sizeof(&c), sizeof(&i), sizeof(&d));

getch();
return 0;
}

今混乱。このマシンでは、変数アドレスは常に 2 バイトの長さです。変数の型に関係なく、ポインター変数であるかどうかに関係なく。しかし、ここに非常に多くのエントリがあるのに、なぜサイズが 4 になるのでしょうか? ポインタのサイズは、型に関係なく常に 4 です。変数が格納される >address< のサイズは 2 です。また、ポイントされる内容は、型に応じたサイズになります。

sizeof の出力に 4 が表示されるのはなぜですか??

Borland C++ 5.02 からの私の出力 ここに画像の説明を入力

4

2 に答える 2

3

のような型Tとポインター上のポインターがあるT*** ptr場合ptr、、、、はポインター自体です。おそらく 32 ビット システムで作業している (または 32 ビット アプリケーションをコンパイルしている) ので、次のようにします。*ptr**ptrsizeof(ptr) == sizeof(*ptr) == sizeof(**ptr)

--- プログラム出力 ---

 4 4 4 4 1

 4 4 4 4 4

 4 4 4 4 8

  sizeof(char) = 1、sizeof(int) = 4、sizeof(double) = 8
 sizeof(&char) = 4、sizeof(&int) = 4、sizeof(&double) = 4

&ptrは のアドレス/ポインタなT***ので、サイズも 4 です。ポインターをその最大レベル ( ) に逆参照する場合にのみ、***ptr別のポインターではなく、実際の型を取得します。

于 2012-06-30T19:01:31.357 に答える
0

何が起こっているのかというと、ローカル変数の近くの (16 ビット) ポインターを取得していると思いますが、型 * として宣言されたポインターは遠くの (32 ビット) ポインターです。

これは、16 ビット Intel プロセッサ (または「リアル モード」の 32 ビット プロセッサ) で作業する場合の癖です。たとえば、DOS では、1 MB のメモリ (または実際には 640 kB) しかアクセスできません。far ポインタの上位 16 ビットはセグメント (メモリ内の 64k ページ) で、下位 16 ビットはオフセットです。

http://en.wikipedia.org/wiki/Real_mode

http://wiki.answers.com/Q/What_are_near_far_and_huge_pointers_in_C

これを再現できない回答者は、32 ビット (またはそれ以上) のプロセッサで 32 ビット (またはそれ以上) の OS を使用している可能性が最も高いです。

于 2012-06-30T21:47:06.177 に答える