2017-05-30 3 views
1

私は現在C++コースを受講しており、ポインタについて学習しています。以下は私の教授が私たちに与えた例です。私は2つの質問持って2次元配列を測定するオペレータのサイズ

int b[3][3]; //Assume integers and memory addresses are 4 bytes 
cout << sizeof(b) << endl; // 36 bytes 
cout << sizeof(b+0) << endl; // 4 bytes 
cout << sizeof(*(b+0)) << endl; //12 bytes 

  1. を私は2番目の1(sizeof(b+0))を試してみました、それが代わりに私に8を与えますか?どのようにそれは事件ですか?

  2. また、私は第3のものの背後にあるロジック(sizeof(*(b+0))を理解したいと思います。最初の行の合計なので12ですか? intは3つあり、各intは4バイトなので、合計で12バイトを返します。

ご協力いただきありがとうございます。

+3

CはC++と同じではありません。あなたはCタグを削除する必要があります – Miket25

+0

sizeofは関数ではありません。それはキーワードです。 – ikh

答えて

1

SIZEOF関数に..

sizeofは、オペレータ、ない機能です。続きを読むWhy is sizeof considered as an operator?

代わりに私に8を与えますか?

ポインタに崩壊します。

これは第1行の合計なので12ですか?

はい。それは、3つの整数の1D配列を持つようなものです。


あなたもこれらをチェックすることがあります:あなたが呼び出す場合sizeof(int[])あなたがのサイズを取得しないこと

「この警告があなたを語っている:警告について

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp 
main.cpp:8:21: warning: sizeof on pointer operation will return size of 
     'int (*)[3]' instead of 'int [3][3]' [-Wsizeof-array-decay] 
    cout << sizeof(b+0) << endl; // 4 bytes 
        ~^ 
1 warning generated. 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
36 
8 
12 
4 // sizeof(int) 
8 // sizeof(int*) 

を配列ではなく、int*ポインタのサイズです。

から取られたanswer

0

1)64ビットアドレスのシステムでは、ポインタは8バイト64/8です。

2)2D配列は、配列へのポインタの配列として格納されます。したがって、*(b + 0)を実行すると、3つのintの配列である配列bの最初の位置の内容が得られます。 *(b + 0)はb [0]と等価です。

+0

基本的には@gsamarasで与えられたものと同じ答えですが、異なる書き方です。 HTH – frt