Как бы вы прочитали эти определения? - PullRequest
3 голосов
/ 27 сентября 2019

Как мне прочитать каждое из этих определений?

  1. const char *arguments[]
  2. char *const arguments[]

Я видел примеры кода execl()используя первую форму, но не смог заставить ее работать под Linux и пришлось использовать вторую форму?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

const char * arguments []

arguments - это массив неизвестных размеров указателей на const квалифицированных char.

char * const arguments []

arguments - это массив с неизвестным размером const квалифицированных указателей на char.

1 голос
/ 27 сентября 2019

В 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 ) );

объявляют одну и ту же функцию.

...