2

Cで...

次のような文字列の多次元配列があるとします。

//Array declared in main. Will Contains strings from user-input later on
char myArray[10][10];

この関数に配列を渡すことができないのはなぜですか

//Function prototype:
void myFunc (char *mynewArray[]);

// Function call in main()
myFunc(myArray);

配列とポインターについての私の理解は、myFunc を呼び出すとき、配列のアドレスを渡しているということです。受信関数は、このアドレス ストアをポインタとして受け取ります。その後、myFunc で mynewArray[1] にアクセスできるはずです。しかし、それは動作しませんか?

配列とポインターを間違って理解していますか?

4

3 に答える 3

2
void myFunc (char *mynewArray[]);

C では次と同等です。

void myFunc (char **mynewArray);

しかし、あなたの配列の値はですchar (*)[10]

次のようなものが必要です。

void myFunc (char (*mynewArray)[10]);

または同等の

void myFunc (char mynewArray[][10]);

覚えて:

  1. 配列の値はその最初の要素へのポインターです (配列オブジェクトはポインターに変換されます)
  2. 関数宣言で、型配列のパラメーターがT型ポインターに調整されますT
于 2013-02-16T15:38:40.653 に答える
0

C 宣言の読み方に関するヒントを次に示します。

  1. 識別子名を見つける
  2. 右に見て
  3. 左を見る

優先順位を付けるために括弧で変更する必要がありますが、広く適用できます。

[ 「配列」と表示されたら

( が表示されたら、「関数」と言います。

例えば:char *mynewArray[]

(名前) mynewArray は (右を見てください) char への (左を見て) ポインターの配列です。

そして次:char myArray[10][10];

myArray は、10 文字の 10 個の配列の配列です。

違いは何ですか?

インクリメントmynewArrayすると、アドレスは char への 1 つのポインタのサイズだけ変化します。

インクリメントmyArrayすると、アドレスは 10 文字のサイズで変更されます。

それが彼らが違う理由です。

関数プロトタイプでは、 の左端のセットは[]空 (または で置き換え*) にする必要があり、 の後続のセットは[]サイズを持つ必要があります。

于 2013-02-16T16:07:59.017 に答える
0

これは非常に頻繁に寄せられる質問であるため、comp.lang.cニュースグループには何年もの間、その質問のためだけの FAQ エントリがありました。では、C における「ポインタと配列の同等性」とは何を意味するのでしょうか?

TL;DR:ポインター演算配列インデックスは同等です。したがって、それらは異なっていても (配列はストレージを割り当て、ポインターはメモリーアドレスを参照するだけです)、ポインターを使用して配列の要素にアクセスしたり、配列をシミュレートしたりできます。

標準は次のように述べています。

式に現れる array-of-T 型のオブジェクトへの参照は、(3 つの例外を除いて) 最初の要素へのポインターに崩壊します。結果のポインターの型は T へのポインターです。

例外は、配列がsizeofor&演算子のオペランドである場合です。


これが意味することは、あなたのコードでmyArrayは、 は に相当するということ&myArray[0]です。の型は& myArray[0]ですchar *[10]。これは、メモリレイアウトが異なるためchar **、同じタイプではありません。char *[]したがって、コンパイラは変換を拒否しています (これは無効です)。

混乱は、1 次元配列に由来します。型char *とが異なっていても (メモリ レイアウトが異なります)、2 つの配列型の変数を定義すると、どちらが型 であるかと同等に減衰char []します。char [10]&a[0]char *

于 2013-02-16T16:44:50.437 に答える