2016-03-07 2 views
0

Если бы я имел статический постоянный символ 'NAME' как массив, написав что-то такое, как:Static/Const Тип * Const разница

static const *char NAME[8] = {"gregory"}; 

быть такой же, как написание:

const char *const NAME[8] = {"gregory"}; 

Под этим я имею в виду, что они оба статичны, я слышал, что снова добавление const внутри * делает его статическим.

Я знаю, чем статические и постоянные/буквальным отличаются наличием только static char или const char

+1

Что ваш вопрос? –

+0

Первая строка плохо сформирована, возможно, вы имели в виду 'static const char * const NAME [8] = {" gregory "};' –

ответ

1
` static const ` 

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

Если вы так склонны использовать #define NAME "gregory"

, который работает так же хорошо. Тогда вы можете иметь:

strcat(*ptrOtherString,NAME);

+0

массив, статический и постоянный. не лучше держаться подальше от #DEFINE. – user9251622

+0

Вот почему я сказал: «Если я так склонен», я знаю, что некоторым людям не нравится определять строки, а новые языки их не имеют. –

1

Ключевое слово static имеет три использования в C:

  1. Чтобы сделать локальные переменные длительные после выхода из блока.
  2. Сделать локальные переменные продолжительными в течение всего срока службы программы.
  3. Предотвращение экспорта символов в компоновщик, что делает их «частными» для исходного файла.

Таким образом, ключевое слово static дает объект «статический класс хранения», который дает ему вышеупомянутые функции.

Под этим я подразумеваю, что они оба статичны, я слышал, как снова возникает константа внутри *, делает ее статической.

Не совсем. «класс статического хранения» присваивается объектам «спецификаторами класса хранения», такими как auto, register, static и extern, а не «квалификаторы типа», такие как const. Очевидно, что нельзя выполнять работу другого. Если второй оператор не находится за пределами функции, он не является «статическим» из-за отсутствия ключевого слова static.

+1

Эти два случая в основном говорят одно и то же. Другое использование для 'static' - это предотвращение экспорта символов в компоновщик (что делает их эффективно« частными »в исходном файле). –

+0

@JohnBode Спасибо, теперь мой ответ улучшен. –

1

Под этим я подразумеваю, что они оба статичны, я слышал, что снова поместил const внутри *, делает его статическим.

Неверное изображение; const не влияет на продолжительность хранения. static Срок хранения означает, что хранилище для массива выделяется при запуске программы и сохраняется до тех пор, пока программа не завершится. const просто обозначает что-то как немодифицируемое.

const T *p и T const *p оба означают, что p является указателем на const T ; p может быть изменен (вы можете установить его на другой объект), но *p нет (вы не можете изменить вещь p пунктов).

T * const p означает, что p является указателем const в T; *p может быть изменен (вы можете изменить вещь p пунктов), но p нет (вы не можете установить p, чтобы указать на другое).

const T *const p и T const *const p оба означают, что оба p и *p не поддаются изменению.

Чтобы сделать что-то время хранения static, вы должны либо объявить его в области файла (вне тела любой функции), либо с помощью ключевого слова static.


1. Тип спецификаторов (int, char, float и т.д.) и типа классификаторов (const, volatile) могут появляться в любом порядке в декларации; const unsigned long и long const unsigned оба означают одно и то же, хотя ваши сверстники, вероятно, побьют вас, если вы использовали вторую форму. В настоящее время, это также относится к классу хранения спецификаторов (static, auto), хотя пересмотр будущего языка может потребовать, чтобы все спецификаторов класса хранения прийти первым в объявлении

Смежные вопросы