2

基本的に、この関数で渡して変更したいchar *の配列があるので、char*の配列へのポインターを渡します。つまり、char *arr[]へのポインタを渡したいのです。2つの違いは何ですか?

4

2 に答える 2

8

いつものように、 http: //cdecl.orgはあなたの友達です:

  • char * (*arr)[]- 「arr を char へのポインターの配列へのポインターとして宣言する」
  • char *** arr- 「arr を char へのポインタへのポインタへのポインタとして宣言する」

これらは同じではありません。まず、1 つ目は不完全な型です (配列へのポインターを使用するには、コンパイラーは配列のサイズを知る必要があります)。

あなたの目的は完全に明確ではありません。本当にやりたいことは、の配列の基になるデータを変更することだけだと思いますchar *。その場合は、最初の要素へのポインターを渡すだけです。

void my_func(char **pointers) { 
    pointers[3] = NULL;  // Modify an element in the array
}

char *array_of_pointers[10];

// The following two lines are equivalent
my_func(&array_of_pointers[0]);
my_func(array_of_pointers);

本当に配列へのポインターを渡したい場合は、次のようなものが機能します。

void my_func(char *(*ptr)[10]) {
    (*ptr)[3] = NULL;  // Modify an element in the array
}

char *array_of_pointers[10];

// Note how this is different to either of the calls in the first example
my_func(&array_of_pointers);

配列とポインターの重要な違いの詳細については、C FAQ の専用の章を参照してください: http://c-faq.com/aryptr/index.html

于 2012-04-17T00:40:43.137 に答える
0

パラメータとして持つ関数がある場合はchar *(*arr)[]、アドレス演算子を使用して配列を渡す必要があります。

void afunc(char *(*arr)[]);

char *charptra, *charptrb, *charptrc;
char *arr[] = {charptra, charptrb, charptrc};

afunc(&arr);

もう1つは、ポインターを指すポインターを指すポインターを渡す必要があります。

void afunc(char ***);

char arr[] = "str";
char *arrptr = arr;
char **arrptrptr = &arrptr;
char ***arrptrptrptr = &arrptrptr;

afunc(arrptrptrptr);
于 2012-04-17T00:56:10.867 に答える