13

重複の可能性: char ポインターと配列のスタック ポインターの違い

私の質問を説明するには:

int main(void){
    int myary[20];
    int *myaryPtr;
    myaryPtr = myary;

    sizeof(myary); // Will it return 80? Correct?
    sizeof(myaryPtr); // Will it return 4? Correct?
    return 0;
}

まず、私の推測は正しいですか?

そして、私の仮定が正しいと仮定すると、詳細な説明は何ですか? 20 要素の配列が 80 バイトであることは理解していますが、名前はmyary単に配列の最初の要素へのポインターではありませんか? それも4でいいんじゃないの?

4

2 に答える 2

13

intはい、マシン上で anと a ポインターが両方とも 4 バイト長であると仮定すると、あなたの仮定は正しいです。

いいえ、配列はポインターではありません。配列名は、特定のコンテキストではポインターに分解されることがありますが、それらは同じものではありません。comp.lang.c FAQには、この一般的な混乱点に特化したセクション全体があります。

于 2013-01-12T22:42:20.440 に答える
3

int myArr[20]またはとして宣言するかどうかにかかわらず、配列のサイズはメモリに格納されませんint* myArrPtr

何が起こるかというと、(コンパイラによって)定数値sizeof()に置き換えられます。

したがって、myArrはコンパイル前に固定サイズで指定されていたため、コンパイラは割り当てられたメモリの量を正確に認識しています。では、さまざまな配列サイズを動的に割り当てることができるため、myArrPtrのサイズのみが格納されます。

于 2013-01-12T22:55:06.407 に答える