2

[元のタイトルは「sizeof関数」を参照しています。]

私はこれらを試しましたが、すべてうまくいきました。

char * p;

printf( "* pのサイズは%d \ n"、sizeof(* p)); //結果=1
printf( "pのサイズは%d \ n"、sizeof(p)); //結果=4
printf( "pのサイズは%d \ n"、sizeof(&p)); //結果=4

なぜ最初のprintfが1、2番目と3番目が4なのかしら?では、sizeofは実際にどのような引数を取ることができますか?

4

10 に答える 10

10

sizeof関数ではなく、キーワードです。かっこを削除すると、問題なく機能します。これは関数ではないため、指定した任意の型またはオブジェクトで機能します。関数よりもはるかに柔軟性があります。

于 2009-10-12T22:51:40.343 に答える
8

sizeof関数ではありません。それはオペレーターです。sizeof(typename)asとasの2つの方法で使用できますsizeof expression。タイプ名とともに使用する場合は、括弧が必要です。オペランドが式の場合は括弧は必要ありませんが、わかりやすくするために、多くのプログラマーは式に関係なく括弧を付けます。ほとんどのプログラミング言語の演算子とは異なり、通常の状況、つまり、オペランドがC99可変長配列でない場合は引数を評価sizeof expressionないことに注意してください。

于 2009-10-12T22:53:42.307 に答える
5

タイプがかかります。

sizeof(char)常に1つです。変数p自体はポインターであり、プラットフォーム上ではサイズが4です。次に、、&pまたはポインターへのポインター(これもサイズが4)を実行します。

最新のデスクトップシステムのほとんどでは、32ビットアーキテクチャには4バイトのポインタがあり、64ビットアーキテクチャには8バイトのポインタがあります。

sizeofそれ自体はキーワードであり、関数ではなく、コンパイル時に解決されます。C99では、配列は可変長にすることができ、sizeofは実行時までこのサイズを解決するまで待機します。

于 2009-10-12T22:50:46.993 に答える
2

32ビットマシンで作業しているためです。

*p is a character == 1 byte.
p  is a pointer   == 4 bytes.
&p is an address of a pointer == 4 bytes. Same as char**
于 2009-10-12T22:51:18.253 に答える
1

また注意してください:

sizeof 'a' == 1   // C++ 

しかし

sizeof 'a' == 4   /* C */ 

(正確には、pmgによって投稿されたCのsizeof'a' == sizeof(int))。

Cでは、「a」は評価される前にintにプロモートされます。2つの言語間の数少ない非互換性の1つ。

于 2010-10-25T22:36:59.203 に答える
0
sizeof (char)   = 1
sizeof (void *) = 4

最初の文字は1です。これは、charを渡すためです。(pはcharを指します)2番目と3番目の呼び出しはchar * / void *オブジェクトを受け取るため、4を生成します。

于 2009-10-12T22:50:47.913 に答える
0

最初の答えは、charは1バイトであるということです。(実際のcharデータへのポインタを参照解除します)

2つ目は、ポインタ値が4バイト値であるということです。つまり、メモリ位置は4バイト値で表されます。

3つ目は、ポインタのアドレスが4バイトの値であるということです。

サイズはこれらすべての引数を取ることができ、すべての値に対して正確な応答を報告しています。

乾杯。

于 2009-10-12T22:51:19.690 に答える
0

他の返信に加えて、用語の取り違えの可能性に注意してください。

Cの世界では、「byte」は「char」と同じです。つまり、各'char'は定義上1'バイト'です。この「バイト」の意味は、必ずしも基盤となるハードウェアのマシン「バイト」に接続されているとは限りません。AC'byte'(つまり、'char')は、複数のマシン'bytes'で構成できます。ただし、Cプログラムでは、マシンバイトにアクセスできません。すべてがC'バイト'(つまり'chars')で測定され、'sizeof'は'chars'で測定されたサイズを示します。

これらの理由により、「sizeof(char)」は、各「char」が実際に何バイトで構成されているかに関係なく、常に1です。

于 2009-10-12T23:06:45.103 に答える
0

演算子のオペランドはsizeof型です。

オブジェクトまたは値でsizeofを使用する場合は、代わりにその型が使用されます。

sizeof 65; /* same as `sizeof (int);` */
sizeof 'X'; /* same as `sizeof (int);` */
sizeof 42.0; /* same as `sizeof (double);` */
float f;
sizeof f; /* same as `sizeof (float);` */
/* etc ... */

sizeof演算子に直接タイプを指定できます(上記の「同じ」のように)。括弧は、それ自体の構文としてではなく、「オペランドを正しい型にキャストするために」(のように)必要です。(int)2.5sizeof

#include <math.h>
sizeof (12 * log(100)); /* same as `sizeof (double);` */
                        /* without the parenthesis, this would be */
                        /* (sizeof 12) * log(100); */
于 2009-10-12T23:53:00.690 に答える
-1

sizeof演算子は、使用したデータ型のサイズを示します。

#include <stdio.h>

int main()
{
    int a;
    float b;
    char c;
    double d;
    printf("%d",sizeof(a));
    printf("%d",sizeof(b));
    printf("%d",sizeof(c));
    printf("%d",sizeof(d));
} 

出力:

a = 4
b = 4
c = 1 
d = 8

8ビットコンパイラを使用している場合。

于 2013-06-09T15:55:41.117 に答える