2013-08-12 24 views
5

"int *p[3]"(pは3つのポインタの配列で、異なる行のサイズとしてメモリを割り当てることで、任意の数のintの3つの異なる行を持つことができます)を完全に理解しています。int(* p)[3]とint * p [3]の違いは何ですか?

私の混乱は、 "int (*p)[3]"の意味ですか?それは "p"のようにintまたは3つの連続したメモリのアドレスを格納していますか?

プログラム内での使用方法を明確にし、区別する方法を明記してください。

ありがとうございます。

@revised 

重複して質問して申し訳ありません。私は集中的に疑問を捜しませんでした。しかし、私の疑いはまだ初心者プログラマーとして残っています。私はQ/C pointer to array/array of pointers disambiguation

int (*p) [4]?

第2のリンクのページの両方を経て、部分的にので、私の疑問を解消疑問をクリアしてスタックとヒープを参照して、質問の上に説明してください例:

ため
int *p[3]; // (1) 

スタックの12(3 * 4バイト)バイトを取り、ヒープのためには実行時によって異なります。リンクint (*p) [4]?の答えの一つに与えられた1

p1 = new int[7][3]; // (3) 

として 今

ため
int (*p1)[3]; //(2) 

(2)を使用して "新規" になります。今私の質問は "int(* p1)[3]; //(2)"は3 intの配列へのポインタなので、eq(3)のようにコンパイル時にp1がどれくらいのメモリを取るかだから何それから

p1 = new int[n][3]; // (3) where n is an integer

によって置き換えられますか?

説明してください。

+11

http://cdecl.org/ HTTPの – dyp

+0

可能なDUP:// stackoverflow.com/questions/3382951/int-p-4 – lurker

答えて

13
int *p[3]; // type of p is int *[3] 

int (*p)[3]; // type of p is int (*)[3] 

(すなわち、3 int *のアレイ)int *のアレイ3としてpを宣言intのアレイ3(すなわち、へのポインタとしてpを宣言し、 3つの配列へのポインタint

+5

私は、「配列N of T」の代わりに「NTの配列」を読めば、言葉遣いがそれほど厄介ではないと思います。 – cdhowie

+1

2番目の宣言に使用できる別の構文はありますか?何が宣言されているかをもう少し明白にする何か。 –

+1

@BenC。あなたがCを知っているなら、それはかなり明白です。 –

3

宣言の構文Cで少し面倒で、同じ構文がC++によって継承されています。特にarraysおよび機能は、の宣言をラップします。あなたはこれを覚えておく場合、それはあなたを助けるかもしれない:

int (*p)[3]; 
    *p  // p is a pointer to 
int ()[3] // an array of 3 int 

あなたは2行に宣言を壊す考えることができます。

typedef int int3[3]; 
int3 *p; 
+0

Rodríguez私はあなたのために本格的なリクエストを持っています。あなたがすべてのコメントを読んでいれば、私はあなたにすでに質問していることを知っていると思います。私の質問は、[int * p [3];スタック上に12バイトのメモリを食べるので、p [0]は動的に割り当てられた場合、またはスタック(または配列)上のあるメモリに割り当てられている場合はp [1]、p [2]を指します。しかし、[int(* p1)[3];スタックのメモリ容量以前のものと同じようにmallocを使用する方法p [0] = malloc(n0 * sizeof(int)); p [1]、p [2]についても同様ですが、int(* p1)[3]についてはどうでしょうか。どのように使用するのですか。 – zeal

+0

@zeal:これはポインタが8バイトの64ビットアーキテクチャを考えればよいと思いますが、intは4バイトのままです(これは実際には一般的なケースです)。 'int * p [3];'は3つのポインタの配列です。スタックに割り当てられた場合、 '8 * 3 = 24'バイトが必要になります。それぞれのポインタは、他の場所に格納されている 'int'(または複数の連続した' int's)を参照することができます。一方、 'int(* p)[3]'は3つの 'int'の配列へのポインタです。単一のポインタを保持するためにローカルに8バイトをとり、適切に初期化された場合、それは他の場所の '4 * 3 = 12'バイトのブロックを指し示します。 –

+0

Rodríguez、okは64bitアーキテクチャーのケースを取る[int * p [3];動的割り振りをするかどうかに関係なく、スタック上で24バイトのメモリーを取るが、int(* p1)[3]はどうなるだろうか?どのくらいそれはスタックにかかるだろうと他の(私はこのヒントはヒープのみを参照してください)で何を意味するか具体的にしてください。この場合、mallocの使い方の簡単な例を示してください。以前の答えをありがとう。 – zeal

関連する問題