2016-04-26 3 views
0
int* p1; 

単なるポインタです。 new []で使用すると、配列やイテレータのようにインクリメントすることができます。それはいいですが、それは何ですかint * [2]はどのような変数ですか? delcarationのようにint * p2 [2]

int* p2[2]; 

それは2つの要素を持つ配列へのポインタである必要がありますように見えますか?しかし、私が2つの要素の配列を作る場合、私はそれを指すことはできません。とにかくp2を何かにすることはできません。次の多くはちょうどそれの地獄のための別の課題をしようとしているが、実際に私を驚かせたp2 = & arrはうまくいきませんでした。だから、int * [2]とは何か、それはint(*)[2]とどう違うのですか?

int main() 
{ 
    int arr[2]; 

    int* p1;   //pointer to int, can be used like an array 
    int* p2[2];   //pointer to an array 


    p1 = new int[2]; 
    p1 = arr; 
    //p1 = &arr;  //cannot convert ‘int (*)[2]’ to ‘int*’ in assignment 

    //p2 = &arr;  //incompatible types in assignment of ‘int (*)[2]’ to ‘int* [2]’ 
    //p2 = &p1;   //incompatible types in assignment of ‘int**’ to ‘int* [2]’ 

    //p2 = new int[2]; //incompatible types in assignment of ‘int*’ to ‘int* [2]’ 
    //p2 = arr;   //incompatible types in assignment of ‘int [2]’ to ‘int* [2]’ 


} 
+3

'int * p2 [2];は' int'への2つのポインタの配列です。このような宣言が何であるかわからない場合は、[cdecl.org](http://cdecl.ridiculousfish.com/?q=int*+p2%5B2%5D)を使用してください。 –

+0

もちろんです。当時のちょうど1つ。 – roro

+1

配列へのポインタが必要な場合は、 'int(* p2)[2];'になります。この場合、配列の大きさは重要であることに注意してください。たとえば、 'p2'をインクリメントすると、' int'の配列のサイズだけインクリメントします。 –

答えて

4

各要素がintへのポインタである2つの要素の配列。

enter image description here

+1

Paul Rはこれをコメントで指摘しました。正しい考え方で非常に明白です。 – roro

+0

私はDOS用の素晴らしいHELPPCユーティリティ(いつでもプログラムを呼び出す常駐モードを持っていました)と、複雑なC変数宣言のいくつかの例を覚えています。当時の良い訓練でした:D –

+0

HELPPCデータベースのオンライン版があるようです。これはトピックでした:http://stanislavs.org/helppc/c_declarations.html –

0

p2intへのポインタの配列あり、そのサイズ2.あなたがしてp2p1を保存することができます::

cdecl.orgは、これらのタスクのためにあなたの友達です

p2[i] = p1; 

ポインタに配列は、あなたが持っていると思います:

int (*ptr)[2]; 

あなたは、spiral ruleにもっと精巧な宣言を理解するための簡単な方法を読むことをお勧めします。

0

複雑に見えるの宣言を解読するための便利な方法は、右から左に読むことです:

int* p2[2]; 

あなたread from right to leftは、あなたが取得する場合:intへのポインタである2つの要素を持つ配列