передача arg 1 из `foo ‘из несовместимого типа указателя

Почему это показывает предупреждение:

#include foo (const char **p) { } int main(int argc , char **argv) { foo(argv); } 

Но следующее не показывает никакого предупреждения

 char * cp; const char *ccp; ccp = cp; 

Первый fragment кода показывает предупреждение, передающее arg 1 из foo из несовместимого типа указателя. Но второй fragment не показывает никаких предупреждений. Оба являются const указателями

См. Список часто задаваемых вопросов

Вы можете использовать для удаления предупреждений:

 foo((const char **)argv); 

Но, как часто задаваемые вопросы, вопрос: необходимость такого приведения может указывать на более глубокую проблему, которую отличная на самом деле не исправляет.

В зависимости от ваших флагов компиляции вам может понадобиться явное приведение при назначении содержимого cp ccp.

В первой версии вы бросаете между двумя разными типами указателя, а не просто добавляете const в указатель.

  • char ** – указатель на (указатель на char )
  • const char ** – указатель на (указатель на const char )

Поскольку вы можете видеть, что эти указатели указывают на разные типы, похожие на более очевидные:

 int *i; double *d; d = i; 

Во втором примере вы видите, что вы можете отбрасывать указатель на указатель const, поэтому, если бы вы применили это к вашей ситуации, вам нужно было бы указатель const (указатель на char ).

 foo(char * const *p);