4

だから...私はメインに動的に割り当てられた配列を持っています:

int main()
{
    int *array;
    int len;

    array = (int *) malloc(len * sizeof(int));
    ...
    return EXIT_SUCCESS;
}

また、この動的に割り当てられた配列で何かを行う関数を構築したいと考えています。これまでのところ、私の機能は次のとおりです。

void myFunction(int array[], ...)
{
   array[position] = value;
}

次のように宣言した場合:

void myFunction(int *array, ...);

私はまだできるでしょうか:

array[position] = value;

または私はしなければならないでしょう:

*array[position] = value;

...?

また、動的に割り当てられた行列を使用している場合、関数プロトタイプを宣言する正しい方法はどれですか。

void myFunction(int matrix[][], ...);

または

void myFunction(int **matrix, ...);

...?

4

4 に答える 4

6

次のように宣言した場合:

void myFunction(int *array, ...);

私はまだできるでしょうか:

array[position] = value;

はい - これは正しい構文です。

また、動的に割り当てられたマトリックスを使用している場合、関数プロトタイプを宣言するのに正しいものは次のとおりです。

void myFunction(int matrix[][], ...);

または

void myFunction(int **matrix, ...);

...?

複数の次元で作業している場合は、次のように、関数宣言で最初の次元以外のすべてのサイズを宣言する必要があります。

void myFunction(int matrix[][100], ...);

この構文は、あなたが思っていることをしません:

void myFunction(int **matrix, ...);
matrix[i][j] = ...

matrixこれは、int へのポインターへのポインターであるという名前のパラメーターを宣言します。using を逆参照しようとするmatrix[i][j]と、セグメンテーション違反が発生する可能性があります。

これは、C で多次元配列を操作する際の多くの問題の 1 つです。

これは、このトピックに対処するための役立つ SO の質問です: マトリックスを定義し、それを C の関数に渡します。

于 2013-08-29T23:20:35.820 に答える
1

私はまだできるでしょうか:

array[position] = value;

はい、インデックス演算子p[i]は と 100% 同一であるため*(ptr + i)です。5[array]実際、代わりに書くことができ、array[5]それでも機能します。C では、配列は実際には単なるポインターです。配列定義がポインターと異なる唯一の点はsizeof、「真の」配列識別子を取得すると、実際のストレージ サイズが割り当てられますsizeofが、ポインターを取得すると、配列のサイズが得られるだけです。通常、システムの整数サイズです (ただし、異なる場合があります)。

また、動的に割り当てられた行列を使用している場合、関数プロトタイプを宣言する正しい方法はどれですか: (…)

これらは配列へのポインターの配列であり、連続していない可能性があるため、どちらもありません。パフォーマンス上の理由から、行列を連続させたい場合。だからあなたはただ書く

void foo(int matrix[])

内部で正しいオフセットを計算します。

matrix[width*j + i]

ブラケット構文を使用してこれを書くと奇妙に見えることに注意してください。またsizeof、ポインターまたは「指定されていない長さの配列」関数パラメーターの を取得すると、ポインターのサイズが取得されることに注意してください。

于 2013-08-29T23:23:36.400 に答える
1

いいえ、使い続けるだけですarray[position] = value

int *something結局のところ、パラメーターを宣言するか、またはとして宣言するかに実際の違いはありませんint something[]。配列定義は単なる隠しポインター演算であるため、どちらも機能します。

ただし、コードを理解する方法に関して 1 つの違いがあります。

  • int array[]常に配列を示します (ただし、1 つの要素の長さだけかもしれません)。
  • int *pointerただし、単一の整数または整数の配列全体へのポインターである可能性があります。

アドレッシング/表現に関する限り:pointer == array == &array[0]

複数の次元で作業している場合、多次元配列を明示的に定義している場合、C では最後の次元を宣言する必要があるため、状況は少し異なります。

int **myStuff1;    // valid
int *myStuff2[];   // valid
int myStuff3[][];  // invalid
int myStuff4[][5]; // valid
于 2013-08-29T23:24:25.517 に答える