2016-06-13 2 views
-3

Что такое const, когда вы объявляете формальный (функциональный) параметр «указатель типа» как «массив констант»?Что такое const, когда вы объявляете формальный (функциональный) параметр «тип указателя» как «массив констант»?

т.е .: Если T является идентификатор типа, то есть:

void f(const T arr[]); 

эквивалент:

void f(const T * const arr); 

или

void f(const T * arr); 

или

void f(T * const arr); 

И как можно расшифровать стандарты C/C++, чтобы найти эти эквиваленты? :-)

Существуют ли различия между C и C++ и между различными воплощениями стандартов относительно значения заявлений выше? (Для C - стандарты ANSI C89 и позже актуальны)

+0

C11 draft standard n1570: * 6.7.6.3 Объявление функций (включая прототипы) 7 Объявление параметра как '' массив типа '' должно быть отрегулировано на '' квалифицированный указатель на type '', где квалификаторы типа (если есть) - это те, которые указаны в [и] вывода типа массива. * – EOF

+0

Я не понимаю вопроса. Вы спрашиваете: «Что такое const?» Что состязание связано с этим? –

+0

@ChristopherSchneider Хорошо - декларация 'const' обычно предоставляет ограничения доступа на запись к переменной или формальному параметру. Если переменная/формальная является указателем, вы можете либо защитить значение указателя, либо значение объекта, на который указывает, или и то, и другое. Формальные параметры, которые похожи на массивы, на самом деле являются указателями. Я спрашиваю, применяется ли объявление 'const' к значению указателя или к значениям указанного объекта (ов) или того и другого. –

ответ

0

Прежде всего я должен сказать, что:

void f(int const* p); 

и

void f(const int* p); 

имеют тот же смысл, и это означает, что это указатель на значение, которое вы не можете изменить.

Существует antoher способ объявить указатель:

void f(int* const p); 

А это означает постоянный указатель, и вы не можете назначить его на другой адрес.

Что касается вашего вопроса, то код ниже

void f(const T arr[]); 

будет преобразован в

void f(const T* arr); 

Это будет указатель на первого элемента вашего массив

0

Для C++ (в настоящий момент вопрос также отмечен как C):

Здесь три различных типа эквивалентности. [1] Форма формальных аргументов const T arr[] распадается на T const* arr, что поэтому эквивалентно в контексте формального типа аргумента. [2] T const* arr эквивалентен const T* arr, что является другим синтаксисом, выражающим то же самое. [3] В контексте тип функции формальный тип аргумента в T const* arr эквивалентен T const* const arr, поскольку верхний уровень const отбрасывается с целью определения типа функции. То есть две декларации функций, которые таким образом отличаются друг от друга, обозначают одну и ту же функцию.

+0

Я не уверен, почему вы и @Stivius подчеркиваете дело [2] - как я думаю, я не двусмыслен. [3] Я действительно не понимаю. Но на мой главный вопрос отвечает [1]. :-) Знаете ли вы, отличаются ли стандарты от этого поведения? –

+0

Re [3], это всегда было на C++. Извините, я не заметил, что вы также отметили свой вопрос C. Они - два ** разных языка **. ** Нет такого языка **, как «C/C++». Удалите бирку C. –

+0

Я хотел бы сохранить C и C++, потому что я должен обрабатывать этот интерфейс на обоих языках. Моя НАДЕЖДА заключается в том, что ответ на эту тему: «C и C++ здесь не отличаются» :-) –

0

T * const arr средства arr не следует изменять.
const T * arr означает, что *arr не следует изменять.
const T * const arr означает, что ни arr, ни *arr не следует изменять.

Итак, что такое arr в void f(const T arr[]);?
Это как один из вышеперечисленных 3. Сделайте свой выбор перед тем, как мыть над нижним.

void f(const T *arr);


И как можно расшифровать стандарты C/C++, чтобы найти эти эквиваленты?

Прочитать стандарты несколько раз. Полезный сайт для данного экземпляра является C gibberish ↔ English

// declare f as function (pointer to const int) returning void 
void f(const int *); 

Существует ли различие между C и C++, а также между различными воплощениями стандартов?

Да, конечно, поскольку языки C/C++ - разные языки. C++ имеет ссылочные переменные. Ранняя C не имела const и т. Д.

+0

Я имел в виду, если эти 2 языка отличаются в ЭТОЙ точке. Что касается раннего C, я добавлю, что я хочу знать только для C89 и более поздних версий. –

+0

@Mark A. Предложите добавить эти разъяснения к своему сообщению. – chux

+0

Уже сделано (надеюсь) –

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