В C объявители определяются следующим образом
declarator:
pointeropt direct-declarator
, где указатель определяется как
pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer
Таким образом, это объявление
char *const arguments[]
может быть переписанокак
char ( * const ( arguments[] ) )
Итак, объявлен массив с неизвестным размером от constant pointers
до char
.То есть вы не можете изменять элементы массива, потому что они постоянны.Но вы можете изменить объекты, на которые указывают элементы массива, поскольку указанные объекты сами по себе не являются постоянными.
При использовании в качестве объявления параметра это объявление неявно корректируется компилятором для этого объявления
char ( * const * arguments )
Например, эти два объявления функций объявляют одну и ту же функцию
void f( char ( * const ( arguments[] ) ) );
void f( char ( * const * arguments ) );
Это объявление
const char *arguments[]
объявляет массив неизвестного размера от non-constant pointers
до const char
.То есть вы можете изменять элементы массива, но не можете изменять объекты, на которые указывают элементы массива, поскольку указанные объекты являются постоянными.
Это объявление может быть переписано как
const char ( * ( arguments[] ) )
Или он настраивается компилятором на объявление
const char ( ** arguments )
Эти два объявления функций
void f( const char ( * ( arguments[] ) ) );
void f( const char ( ** arguments ) );
объявляют одну и ту же функцию.