sizeof(Array_Name)は、メイン関数で使用されている場合、この配列のバイト数を返しますが、ユーザー定義関数内で使用されている場合ポインタのサイズを戻します(これはポインタとして関数に渡されるためです)。メイン関数内のsizeof(Array_Name)ユーザー定義関数内のsizeof(Array_Name)
私の質問は、mainofの中でsizeof(Array_Name)が使用されているときにポインタとして扱われないのはなぜですか?
sizeof(Array_Name)は、メイン関数で使用されている場合、この配列のバイト数を返しますが、ユーザー定義関数内で使用されている場合ポインタのサイズを戻します(これはポインタとして関数に渡されるためです)。メイン関数内のsizeof(Array_Name)ユーザー定義関数内のsizeof(Array_Name)
私の質問は、mainofの中でsizeof(Array_Name)が使用されているときにポインタとして扱われないのはなぜですか?
これは、配列名が関数に渡されたときにポインタに崩壊するためです。例えば
int main()
{
int arr[3] = { 1, 2, 3 };
printf("main: %zu\n", sizeof(arr));
f(arr);
}
void f(int *ptr)
{
printf("%zu", sizeof(ptr));
}
出力:
main: 3 * sizeof(int)
f: sizeof(int *)
(sizeof...
はあなたのコンパイラに実際の値に置き換えられる場合)
また、それは、配列がmain
かで宣言されているかどうかに依存doesntの。このルールはもっと一般的です:配列が宣言されている関数では、実際の配列として扱われます。関数への引数として渡された場合のみ、最初の要素へのポインタに変換されます。これは、配列をとる関数が最初の要素へのポインタとsize引数を取る理由です。
void print(const int *arr, size_t n)
{
size_t i;
for (i = 0; i < n; ++i)
printf("%d\n", arr[i];
}
編集が完了していません。だからこそ、私のポストは最初はとても低品質でした。あなたのdownvotesを再考してください。 – stackptr
私は気がありますが、char Array_Name [20]のようなものがあります。あなたが宣言した関数から '20'を返しますが、それを他の関数に渡します:void f(char * Array_Name){...}ここで出力される値は4または8ですchar *)。これを理解しやすくするには、まず関数の引数の名前をvoid f(char * My_Pointer){...}に変更します。コンパイル時には 'sizeof'が解決され、実行時には解決されません。コンパイル時には、My_Pointerが文字配列を指すが、さまざまな配列で呼び出すことができるので、(char *)のサイズを評価するのは本当に意味がある。
関連:http://stackoverflow.com/q/492384/694576 – alk