2012-02-23 4 views
2

G'day all、2次元配列へのポインタを設定し、そのポインタを関数に渡す

これはかなり議論されていますが、私はまだ必要なものを見つけることはできません。私はC言語ではまだ新しく、ポインタ、つまり多次元配列へのポインタについても頭を抱えています。

私はint a[2][3]; int (*p) = aのような例を見てきましたが、aが2次元配列の場合、括弧は何をしますか?

私は変数として2D配列を持つプログラムを作成しており、その配列を外部関数に渡してそれを変更する必要があります。

私の配列は、このようinitilisedさ:

unsigned int node[3][2]={ {PINB,PINC}, {0,0}, {0,0} };

私はこれを行うための最善の方法は、ポインタを介していると考えているが、私はどのようにセットアップ2Dに取り、私の関数のプロトタイプをするのか分かりませんアレイ。

NodeToMIDI(node, i, pMIDIdata);

そして、これがその原型である://「node_pointerは」2Dアレイのargである

これは、にし、どのように私はそれを呼び出すそれを渡す機能イムです。

void NodeToMIDI(unsigned int node_pointer, unsigned int node_select, unsigned int * MidiPacket);

誰かがこれを行う方法の背後にある構文とロジックを説明していただけます。私が見ている他のスレッドのいくつかは、私には知られていない構文を持っています。例えば、int ** aなど。

ありがとうございました! Andrew。

答えて

1

あなたが探している署名は次のとおりです。

配列は、ビットのポインタのように振る舞う:あなたはいくつかの背景情報

NodeToMIDI(node, /*something*/, /*something else*/); 
-1

を呼ぶだろう

void NodeToMIDI(unsigned node_pointer[][2], unsigned node_select, unsigned * MidiPacket); 

char* name = {"John"};があれば、名前[2] = hなどの文字にアクセスできます。 名前[0](最初の要素)は、ポインタ名を直接使用する場合と同じです。ポインタnameは、配列内の最初の要素のアドレスを参照します。

したがって、on配列の配列は...ポインタへのポインタです。これは、あなたが説明したように見えます。

int ** a; 

これは、特定のアドレスを参照する別のintポインタを参照するintポインタです。

したがって、unsigned int** arrayOfArrayを関数パラメータとして使用できます。 次に、配列から分かるように要素にアクセスできます。

arrayOfArray[0][2] = 42; 
2

あなたは(コンパイル時に)あなたが知っている場合にのみ配列が自然に機能するために、内部配列のサイズを渡すことができます。

あなたが見た例はおそらくint a[2][3]; int (*p)[3] = aです。角括弧は、pがintへの3つのポインタの配列ではなく、3つのintの配列へのポインタであることを意味します。あなたは配列のようなポインタを逆参照することができるので、pは3つの整数の配列の配列(a)のように使用できます。

同じように、void myfunc(int (*arr)[3]);のようなプロトタイプを書くことができます - aをこの関数に渡すと、それはポインタを取得する関数を渡す関数とまったく同じです。

このプロトタイプを書くもう1つの方法があります:void myfunc(int arr[][3]); - コンパイラは同じ方法でそれを理解しますが、この文書を理解しやすい人もいます。

関連する問題