Тройные звезды: В чем разница между char * (* arr) и char *** arr (в C)?

В принципе, у меня есть массив char *, который я хочу передать и изменить в этой функции, поэтому я передаю указатель на массив char *. То есть, я хочу передать указатель на char * arr []. Какая разница между двумя?

Как всегда, http://cdecl.org – ваш друг:

  • char * (*arr)[] – “объявить arr как указатель на массив указателя на символ”
  • char *** arr – “объявить arr как указатель на указатель на указатель на char”

Это не одно и то же. Для начала первый является неполным типом (чтобы использовать указатель на массив, компилятор должен знать размер массива).

Ваша цель не совсем ясна. Я предполагаю, что действительно все, что вы хотите сделать, это изменить базовые данные в вашем массиве 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 .

Если у вас есть функция, которая имеет char *(*arr)[] в качестве параметра, вам нужно будет передать массив с помощью оператора адреса:

 void afunc(char *(*arr)[]); char *charptra, *charptrb, *charptrc; char *arr[] = {charptra, charptrb, charptrc}; afunc(&arr); 

С другой стороны, вам нужно передать указатель, указывающий на указатель, указывающий на указатель:

 void afunc(char ***); char arr[] = "str"; char *arrptr = arr; char **arrptrptr = &arrptr; char ***arrptrptrptr = &arrptrptr; afunc(arrptrptrptr);