2016-02-22 17 views
8

私は誤って私のポインタに括弧を入れて、私のプログラムの出力が変わったときに、C++でコードをプログラミングしていました。これらのタイプのポインタの違いは何ですか?

私はポインタのこれらの種類の違いを知りたいと思ったプログラミングに新しいですので:

int* A[n]; 
int (*A)[n]; 
int *(A[n]); 

私は、配列にポインタの一種であるというのが私の教科書で読んだことがあります。

+1

配列は、最初の要素へのポインタに対して*減衰することができますが、ポインタではありません。たとえば、配列を関数に渡すか、ポインタの算術演算を使用すると、この減衰が起こります。 –

+1

@JoachimPileborgパラメータがポインタ*である関数に配列を渡すとき。基本的に配列の名前を使って、それを行うポインタを初期化するか、関数に渡すことはありません。 – juanchopanza

+0

は時計回りの渦巻きルールを学び、複雑な宣言について再び混乱することはありません。 http:// stackoverflow。co.jp/a/31789222/3758484 – johnbakers

答えて

15
int* A[n]; 

最初に、要素がどのような型であっても配列があります。ポインタ*を適用すると、Aはintポインタの配列であることがわかります。

int (*A)[n]; 

角括弧を適用すると、ポインタ*はこの場合は配列[]より優先されます。それで、Aは何を指していても、最初のものであり、最も重要なものです。配列[]を適用すると、Aはintの配列へのポインタであることがわかります。

int *(A[n]); 

ブラケットはあなたの第一ケースとして、配列[]、したがって、削除ブラケットがyeildうint* A[n]同じに影響を与える任意の優先順位を変更することはありません。

Are array pointers? 

号アレイは、メモリ・プールに格納ポインタメモリ・プール内の特定のインデックスを指し、参照としてデータがそのメモリ位置に格納されたデータを順次割り当てデータ構造です。

+0

技術的には、配列は* Cのポインタです* – Shark

+14

@Sharkいいえ、配列は崩壊できます*は最初の要素へのポインタになりますが、配列自体はポインタではありません。 –

+4

@shark 'sizeof'は異なると思われます。 – juanchopanza

2

この記事は、基本的に、あなたは次の優先順位に応じて種類を読み出すことができるC. http://www.unixwiz.net/techtips/reading-cdecl.html

で読み取り型宣言で良い例が含まれています

  1. (多くの場合、括弧)最も内側のタイプ

  2. 右ほとんどの種類(主に配列型:[])

  3. 最も外側のものを除く

    左ほとんどの種類、(主にポインタタイプ:*)

  4. 最も外側のタイプ(主にプリミティブ型:int型、CHAR ..)例えば

、あなたが提示したタイプは、次のように読み取ることができます:

int* A[n]; // An array ([n]) of pointer (*) of int. 
int (*A)[n]; // A pointer (*) of array ([n]) of int. 
int *(A[n]); // An array ([n]) of pointer (*) of int. 

したがって、基本的に1番目と3番目のタイプは同じです。

関連する問題