1

私はそれらの記事を読みましたhttp://eli.thegreenplace.net/2010/01/11/pointers-to-arrays-in-c/ http://eli.thegreenplace.net/2010/04/06/pointers- vs-arrays-in-c-part-2d/

何が起こるかについて、もう少し説明が欲しい。

int joe[] = {1, 2, 3, 4};

void test(int (*p)[4])

これは、配列とは異なる配列へのポインターです。

void test(int *d);

これは、渡された配列の最初の要素へのポインター、または別のポインターのコピーになります。僕にできる?

*p = joe //I guess not, I'm obtaining the array passed, and I'm trying to reassign it (which can't be done)
d = joe //I guess not, but I would like to know what would happen to d
*d = joe //Same as above
d = &joe //I'm giving to d the address of joe, what will it be?

どれが正しくてどれが間違っているか、そしてその理由。

2 次元配列 (実際には単なる 1 次元配列) に関する記事で、彼は次のように書いています。

void bar(int arr[2][3], int m, int n)
void bar(int arr[][3], int m, int n)
void bar(int (*arr)[3], int m, int n)

はすべて正しいです。

1) 質問:

void bar(int arr[][3], int m, int n)
void bar(int arr*[3], int m, int n)

同じだ?そうでない場合、それらの違いは何ですか?

2) 質問:

 void bar(int arr[][3], int m, int n)
 void bar(int (*arr)[3], int m, int n)

それらの違いは何ですか?なぜ両方が機能するのですか?

背後で何が起こっているのかについて詳細な説明をいただければ幸いです。質問が明確であることを願っています。

4

1 に答える 1

3

関数パラメータ宣言

void bar(int arr[]); /* this is a pointer to int */

と同等です

void bar(int arr[5]); /* this is a pointer to int, compiler just ignores 5 */

と同等です

void bar(int *arr); /* this is a pointer to int */

すべての場合において、int へのポインタまたは intの配列へのポインタが に与えられますbar()。特にpointerに注意してください。これは、内部bar()で、sizeof(arr)常にsizeof(int*)、決してsizeof(int[5])、またはsizeof(int[3])たとえばになることを意味します。

多次元配列を含む残りは、この単純な規則に従います。

質問1)

  • コンパイラは、それvoid bar(int arr*[3], ...)は無効であると教えてくれます。
  • の配列であり、ポインターへのポインターに変換され*ます。void bar(int *arr[3], ...)int*int **arr
  • これはvoid bar(int arr[][3], ...)、3 つの int の配列へのポインター、または 2 番目の次元が 3 である多次元配列へのポインターである とは異なります。

質問2)

  • この2つに違いはありません。上記の質問 1 のように、どちらも 3 つの int の配列へのポインターです。

Googleからさらに読む:c宣言を解釈する

最後に 1 つのアドバイス: 恥ずかしがらずにコンパイラを使用してください。コードが有効かどうかがわかります。

于 2012-11-23T10:59:55.863 に答える