1

サンプルコード:

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

int main()
{
        int arr[5] = {10,20,30,40,50};
        int *p;
        p = arr;
        printf("Total size calculating from array = %ld\n", sizeof(arr));
        printf("Total size calculating from pointer = %ld \n",sizeof(p));
        return 0;
}

出力:

Total size calculating from array = 20
Total size calculating from pointer = 8 

これまでの私の理解では、配列のアドレスを同じデータ型のポインターに割り当てて、問題なくすべての操作を実行できるということでした。しかし、sizeof異なる値を返しています。

だから私はここでいくつか質問があります:

  • 良い練習を割り当てることはありますか?
  • 割り当てを行うと、何が変更されますか?
  • なぜ8?
4

4 に答える 4

1

配列サイズは、配列の合計サイズを示します。この場合、5 つの整数です。しかし、配列へのポインタは実際には、使用しているシステムによってサイズが異なるメモリ アドレスを格納します。だから彼らは違う

于 2013-07-16T05:41:39.520 に答える
1

割り当ては良い実践ですか?

はい、たとえば、配列を関数に渡すと、ポインターに崩壊します。元のポインターを保持する必要があるとしますが、配列を反復処理するために別のポインターも必要です。同じアドレスを指す別のポインターを宣言し、それを使用して反復処理します。

割り当てを行うと、何が変更されますか?

ポインタはアドレスを指しています。それはそれです(以前は別のアドレスまたはNULLを指していた可能性があります)。担当者(あなたの場合は配列)は変更されません。配列とポインタには大きな違いがあるため、異なる結果が得られます。ポインターと配列は一見同等に見えるだけです。

ポインターを使用して配列の内容にアクセスして変更することはできますが、この 2 つは同じではありません ( の結果が示すようにsizeof)。

なぜ8?

32 ビット マシンでは、ポインターは通常 4 バイトの大きさで、64 では 8 バイトです。ローカル配列のサイズを取得する場合、sizeofは配列内の要素の数に各要素の大きさを掛けます。それぞれ 4 バイトの大きさの 5 つの整数は 20 に相当します。

于 2013-07-16T05:41:46.090 に答える
0

なぜ8?

sizeofstatically演算子は、定義された配列の合計バイト サイズを示しますが、ポインターの場合はpointer、64 ビット システムの場合は 8 バイト、32 ビット システムの場合は 4 バイトのサイズを示します。

割り当ては良い実践ですか?

はい、C では多くの選択肢がありませんが、より良い方法はC++ で参照を使用することです。

割り当てを行うと、何が変更されますか?

何も変更されず、元のデータが保持されます。

于 2013-07-16T05:36:59.333 に答える
0

sizeof(arr)あなたの場合は20バイトの配列のサイズを指定しています.実行p = arr;すると、実際には最初の配列要素(&arr[0])のアドレスが整数ポインタに割り当てられますp.したがって、sizeof(p)は整数ポインタのサイズのみを指定します.

配列とポインターは同じではないことに注意してください。配列名はその最初の要素のアドレスです。配列はポインターとして崩壊する可能性があります。

于 2013-07-16T05:37:59.480 に答える