Типы данных C
Стандартная библиотека C (libc) |
---|
Общие темы |
Разные заголовки |
|
В языке программирования C типы данных составляют семантику и характеристики хранения элементов данных. Они выражаются в синтаксисе языка в форме объявлений ячеек памяти или переменных . Типы данных также определяют типы операций или методы обработки элементов данных.
Язык C предоставляет базовые арифметические типы, такие как типы целых и действительных чисел , а также синтаксис для построения массивов и составных типов. Заголовки стандартной библиотеки C , которые будут использоваться через директивы include , содержат определения типов поддержки, которые имеют дополнительные свойства, такие как предоставление хранилища точного размера, независимо от реализации языка на конкретных аппаратных платформах. [1] [2]
Основные типы
[ редактировать ]Основные типы
[ редактировать ]Язык C предоставляет четыре основных спецификатора арифметических типов. чар , интервал , плавать и double и модификаторы подписано , без подписи , короткий и длинный . В следующей таблице перечислены допустимые комбинации при указании большого набора объявлений, зависящих от размера хранилища.
Тип | Объяснение | Минимальный размер (биты) | Спецификатор формата | Диапазон | Суффикс десятичных констант |
---|---|---|---|---|---|
голец | Наименьшая адресуемая единица машины, которая может содержать базовый набор символов. Это целочисленный тип. Фактический тип может быть как знаковым, так и беззнаковым. Он содержит биты CHAR_BIT. [3] | 8 | %c |
[ ЧАР_МИН , CHAR_MAX ] | — |
подписанный символ | Тот же размер, что и char , но гарантированно подписан. Способен содержать как минимум диапазон [-127, +127] . [3] [а] | 8 | %c [б] |
[ SCHAR_MIN , SCHAR_MAX ] [6] | — |
беззнаковый символ | Тот же размер, что и char , но гарантированно беззнаковый. Содержит как минимум диапазон [0, 255] . [7] | 8 | %c [с] |
[0, UCHAR_MAX ] | — |
|
Короткий целочисленный тип со знаком. Способен содержать как минимум диапазон [ −32 767 , +32 767 ] . [3] [а] | 16 | %hi или %hd |
[ SHRT_MIN , SHRT_MAX ] | — |
|
Короткий беззнаковый целочисленный тип. Содержит как минимум диапазон [ 0 , 65 535 ] . [3] | 16 | %hu |
[0, USHRT_MAX ] | — |
|
Базовый целочисленный тип со знаком. Способен содержать как минимум диапазон [ −32 767 , +32 767 ] . [3] [а] | 16 | %i или %d |
[ INT_MIN , INT_MAX ] | никто [8] |
|
Базовый целочисленный тип без знака. Содержит как минимум диапазон [ 0 , 65 535 ] . [3] | 16 | %u |
[0, UINT_MAX ] | ты или В [8] |
|
длинным Целочисленный тип с знаком. Способен содержать как минимум диапазон [ −2 147 483 647 , +2 147 483 647 ] . [3] [а] | 32 | %li или %ld |
[ ДОЛГ_МИН , LONG_MAX ] | л или л [8] |
|
Длинный беззнаковый целочисленный тип. Способен содержать как минимум диапазон [ 0 , 4 294 967 295 ] . [3] | 32 | %lu |
[0, ULONG_MAX ] | оба ты или У и л или л [8] |
|
Длинный целочисленный тип со знаком. Способен содержать как минимум диапазон [ -9 223 372 036 854 775 807 , +9 223 372 036 854 775 807 ] . [3] [а] Указано начиная с C99 . версии стандарта | 64 | %lli или %lld |
[ SHIP_MIN , LLONG_MAX ] | или LL [8] |
|
Длинный длинный беззнаковый целочисленный тип. Содержит как минимум диапазон [ 0 , 18 446 744 073 709 551 615 ] . [3] Указано начиная с C99 . версии стандарта | 64 | %llu |
[0, ULLONG_MAX ] | оба ты или У и или LL [8] |
плавать | Реальный тип с плавающей запятой, обычно называемый типом с плавающей запятой одинарной точности. Фактические свойства не указаны (кроме минимальных пределов); однако в большинстве систем это двоичный формат с плавающей запятой одинарной точности IEEE 754 (32 бита). Этот формат требуется дополнительным Приложением F «Арифметика с плавающей запятой IEC 60559». | Преобразование из текста: [д]
|
для Ф | ||
двойной | Реальный тип с плавающей запятой, обычно называемый типом с плавающей запятой двойной точности. Фактические свойства не указаны (кроме минимальных пределов); однако в большинстве систем это двоичный формат с плавающей запятой двойной точности IEEE 754 (64 бита). Этот формат требуется дополнительным Приложением F «Арифметика с плавающей запятой IEC 60559». |
|
|||
длинный двойной | Реальный тип с плавающей запятой, обычно сопоставленный с расширенной точности форматом чисел с плавающей запятой . Фактические свойства не указаны. Это может быть формат с плавающей запятой расширенной точности x86 (80 бит, но обычно 96 бит или 128 бит в памяти с байтами заполнения ), формат с плавающей запятой, отличный от IEEE « дабл-дабл » (128 бит), формат с плавающей запятой четверной точности IEEE 754. -формат точки (128 бит) или такой же, как двойной. смотрите в статье о long double Подробности . | %Lf %LF %Lg %LG %Le %LE %La %LA [и] |
л или л |
- ^ Jump up to: а б с д и Минимальные диапазоны [−(2 п -1 −1), 2 п -1 −1] (например, [−127,127]) происходят из различных целочисленных представлений, разрешенных стандартом ( дополнение до единиц , величина знака , дополнение до двух ). [4] Однако большинство платформ используют дополнение до двух, подразумевая диапазон вида [−2 м −1 , 2 м −1 −1] с m ≥ n для этих реализаций, например [−128,127] (
SCHAR_MIN == −128
иSCHAR_MAX == 127
) для 8-битного знакового символа . Начиная с C23, единственным допустимым представлением является дополнение до двух, поэтому значения варьируются как минимум от [−2 п -1 , 2 п -1 −1] . [5] - ^ или
%hhi
для числового вывода - ^ или
%hhu
для числового вывода - ^ Эти строки формата также существуют для форматирования текста, но работают с двойным числом.
- ^ Jump up to: а б Прописные буквы отличаются от строчных при выводе. Спецификаторы верхнего регистра выдают значения в верхнем регистре, а строчные — в нижнем (%A, %E, %F, %G выдают такие значения, как INF, NAN и E (экспонента) в верхнем регистре).
Фактический размер целочисленных типов зависит от реализации. Стандарт требует только соотношения размеров между типами данных и минимальных размеров для каждого типа данных:
Требования к отношениям заключаются в том, что long long
не меньше, чем длиной , которая не меньше int , который не меньше короткий . Как Размер char всегда является минимальным поддерживаемым типом данных, никакие другие типы данных (кроме битовых полей ) не могут быть меньше.
Минимальный размер для char — 8 бит, минимальный размер для короткий и int составляет 16 бит, поскольку долго это 32 бита и long long
должен содержать не менее 64 бит.
Тип int должен быть целочисленным типом, с которым целевой процессор работает наиболее эффективно. Это обеспечивает большую гибкость: например, все типы могут быть 64-битными. Однако популярны несколько различных схем целочисленной ширины (моделей данных). Поскольку модель данных определяет, как взаимодействуют различные программы, в рамках данного интерфейса приложения операционной системы используется единая модель данных. [9]
На практике, char обычно имеет размер 8 бит и short обычно имеет размер 16 бит (как и их беззнаковые аналоги). Это справедливо для таких разнообразных платформ, как SunOS 4 Unix 1990-х годов, Microsoft MS-DOS , современный Linux и Microchip MCC18 для встроенных 8-битных микроконтроллеров PIC . POSIX требует char иметь размер ровно 8 бит. [10] [11]
Различные правила стандарта C делают unsigned char
базовый тип, используемый для массивов, подходящих для хранения произвольных объектов без битовых полей: отсутствие битов заполнения и представлений ловушек, определение представления объекта , [7] и возможность псевдонимов. [12]
Фактический размер и поведение типов с плавающей запятой также зависят от реализации. Единственное требование состоит в том, что long double
не меньше, чем двойной , который не меньше плавать . Обычно для плавать и соответственно вдвое .
Стандарт C99 включает новые типы реальных чисел с плавающей запятой. float_t и double_t , определенный в <math.h>
. Они соответствуют типам, используемым для промежуточных результатов выражений с плавающей запятой, когда FLT_EVAL_METHOD имеет значение 0, 1 или 2. Эти типы могут быть шире, чем long double
.
В C99 также добавлены сложные типы: float _Complex
, double _Complex
, long double _Complex
. В C11 добавлены мнимые типы (которые были описаны в информативном приложении к C99): float _Imaginary
, double _Imaginary
, long double _Imaginary
. Включая заголовок <complex.h>
позволяет получить доступ ко всем этим типам с помощью сложный и мнимое соответственно.
Логический тип
[ редактировать ]В C99 добавлен логический тип данных. _Bool
. Кроме того, <stdbool.h>
заголовок определяет bool
в качестве удобного псевдонима для этого типа, а также предоставляет макросы для true
и false
. _Bool
функционирует аналогично обычному целочисленному типу, за одним исключением: любые присваивания _Bool
значения, отличные от 0 (ложь), сохраняются как 1 (истина). Такое поведение существует для того, чтобы избежать целочисленного переполнения при неявных сужающих преобразованиях. Например, в следующем коде:
unsigned char b = 256;
if (b) {
/* do something */
}
Переменная b
оценивается как ложь, если unsigned char
имеет размер 8 бит. Это связано с тем, что значение 256 не соответствует типу данных, в результате чего используются младшие 8 битов, что приводит к нулевому значению. Однако изменение типа приводит к тому, что предыдущий код ведет себя нормально:
_Bool b = 256;
if (b) {
/* do something */
}
Тип _Bool также гарантирует, что истинные значения всегда сравниваются равными друг другу:
_Bool a = 1, b = 2;
if (a == b) {
/* this code will run */
}
Целочисленные типы с точностью до бита
[ редактировать ]Начиная с C23 , язык позволяет программисту определять целые числа, ширина которых составляет произвольное количество бит. Эти типы указаны как _BitInt(N)
, где N — целочисленное константное выражение, обозначающее количество битов, включая знаковый бит для знаковых типов, представленных в дополнении до двух. Максимальное значение N обеспечивается BITINT_MAXWIDTH
и это по крайней мере ULLONG_WIDTH
. Следовательно, тип _BitInt(2)
(или signed _BitInt(2)
) принимает значения от −2 до 1, а unsigned _BitInt(2)
принимает значения от 0 до 3. Тип unsigned _BitInt(1)
также существует, имеет значение 0 или 1 и не имеет эквивалентного знакового типа. [13]
Типы различий в размерах и указателях
[ редактировать ]Спецификация языка C включает в себя определение типа с size_t
и ptrdiff_t
для представления величин, связанных с памятью. Их размер определяется в соответствии с арифметическими возможностями целевого процессора, а не возможностями памяти, такими как доступное адресное пространство. Оба эти типа определены в <stddef.h>
заголовок ( cstddef
на С++).
size_t
— это целочисленный тип без знака, используемый для представления размера любого объекта (включая массивы) в конкретной реализации. Оператор sizeof возвращает значение типа size_t
. Максимальный размер size_t
предоставляется через SIZE_MAX
, макроконстанта, которая определена в <stdint.h>
заголовок ( cstdint
заголовок в C++). size_t
гарантированно будет иметь ширину не менее 16 бит. Кроме того, POSIX включает в себя ssize_t
, который представляет собой целочисленный тип со знаком той же ширины, что и size_t
.
ptrdiff_t
— это целочисленный тип со знаком, используемый для представления разницы между указателями. Гарантируется, что он будет действителен только для указателей одного и того же типа; вычитание указателей, состоящих из разных типов, определяется реализацией.
Интерфейс к свойствам базовых типов
[ редактировать ]Информация о фактических свойствах основных арифметических типов, таких как размер, предоставляется через макроконстанты в двух заголовках: <limits.h>
заголовок ( climits
заголовок в C++) определяет макросы для целочисленных типов и <float.h>
заголовок ( cfloat
заголовок в C++) определяет макросы для типов с плавающей запятой. Фактические значения зависят от реализации.
Свойства целочисленных типов
[ редактировать ]CHAR_BIT
– размер типа char в битах, обычно называемый размером байта (не менее 8 бит).SCHAR_MIN
,SHRT_MIN
,INT_MIN
,LONG_MIN
,LLONG_MIN
(C99) – минимально возможное значение целочисленных типов со знаком: подписанный char, подписанный короткий, подписанный int, подписанный длинный, подписанный длинный длинныйSCHAR_MAX
,SHRT_MAX
,INT_MAX
,LONG_MAX
,LLONG_MAX
(C99) – максимально возможное значение целочисленных типов со знаком: подписанный char, подписанный короткий, подписанный int, подписанный длинный, подписанный длинный длинныйUCHAR_MAX
,USHRT_MAX
,UINT_MAX
,ULONG_MAX
,ULLONG_MAX
(C99) – максимально возможное значение беззнаковых целых типов: unsigned char, unsigned short, unsigned int, unsigned long, unsigned long longCHAR_MIN
– минимально возможное значение charCHAR_MAX
– максимально возможное значение charMB_LEN_MAX
– максимальное количество байтов в многобайтовом символеBOOL_WIDTH
(C23) - разрядность_Bool
, всегда 1CHAR_WIDTH
(C23) - разрядностьchar
;CHAR_WIDTH
,UCHAR_WIDTH
иSCHAR_WIDTH
равныCHAR_BIT
по определениюSCHAR_WIDTH
,SHRT_WIDTH
,INT_WIDTH
,LONG_WIDTH
,LLONG_WIDTH
(C23) - разрядностьsigned char
,short
,int
,long
, иlong long
соответственноUCHAR_WIDTH
,USHRT_WIDTH
,UINT_WIDTH
,ULONG_WIDTH
,ULLONG_WIDTH
(C23) - разрядностьunsigned char
,unsigned short
,unsigned int
,unsigned long
, иunsigned long long
соответственно
Свойства типов с плавающей запятой
[ редактировать ]FLT_MIN
,DBL_MIN
,LDBL_MIN
– минимальное нормализованное положительное значение float, double, long double соответственноFLT_TRUE_MIN
,DBL_TRUE_MIN
,LDBL_TRUE_MIN
(C11) – минимальное положительное значение float, double, long double соответственноFLT_MAX
,DBL_MAX
,LDBL_MAX
– максимальное конечное значение float, double, long double соответственноFLT_ROUNDS
– режим округления для операций с плавающей запятойFLT_EVAL_METHOD
(C99) – метод оценки выражений, включающий различные типы с плавающей запятой.FLT_RADIX
– основание экспоненты в типах с плавающей запятойFLT_DIG
,DBL_DIG
,LDBL_DIG
– количество десятичных цифр, которые могут быть представлены без потери точности с помощью float, double, long double соответственноFLT_EPSILON
,DBL_EPSILON
,LDBL_EPSILON
– разница между 1,0 и следующим представимым значением float, double, long double соответственноFLT_MANT_DIG
,DBL_MANT_DIG
,LDBL_MANT_DIG
– количествоFLT_RADIX
-базовые цифры в мантиссе с плавающей запятой для типов float, double, long double соответственноFLT_MIN_EXP
,DBL_MIN_EXP
,LDBL_MIN_EXP
– минимальное отрицательное целое число такое, чтоFLT_RADIX
возведенный в степень, меньшую, чем это число, представляет собой нормализованное число с плавающей запятой, двойное, длинное двойное значение соответственноFLT_MIN_10_EXP
,DBL_MIN_10_EXP
,LDBL_MIN_10_EXP
– минимальное отрицательное целое число, такое, что 10, возведенное в эту степень, представляет собой нормализованное число с плавающей запятой, двойное или длинное двойное значение соответственноFLT_MAX_EXP
,DBL_MAX_EXP
,LDBL_MAX_EXP
– максимальное положительное целое число такое, чтоFLT_RADIX
возведенный в степень, меньшую, чем это число, представляет собой нормализованное число с плавающей запятой, двойное, длинное двойное значение соответственноFLT_MAX_10_EXP
,DBL_MAX_10_EXP
,LDBL_MAX_10_EXP
– максимальное положительное целое число, такое, что 10, возведенное в эту степень, представляет собой нормализованное число с плавающей запятой, двойное или длинное двойное значение соответственноDECIMAL_DIG
(C99) – минимальное количество десятичных цифр, при котором любое число самого широкого поддерживаемого типа с плавающей запятой может быть представлено в десятичном формате с точностьюDECIMAL_DIG
цифры и считывать обратно в исходном типе с плавающей запятой, не меняя его значения.DECIMAL_DIG
это минимум 10.
Целочисленные типы фиксированной ширины
[ редактировать ]Стандарт C99 включает определения нескольких новых целочисленных типов для повышения переносимости программ. [2] Уже доступные базовые целочисленные типы были сочтены недостаточными, поскольку их фактические размеры определяются реализацией и могут различаться в разных системах. Новые типы особенно полезны во встроенных средах , где оборудование обычно поддерживает только несколько типов и эта поддержка варьируется в зависимости от среды. Все новые типы определены в <inttypes.h>
заголовок ( cinttypes
заголовок на C++), а также доступны по адресу <stdint.h>
заголовок ( cstdint
заголовок в C++). Типы можно сгруппировать в следующие категории:
- Целочисленные типы точной ширины, которые гарантированно будут иметь одинаковое количество n бит во всех реализациях. Включается только в том случае, если он доступен в реализации.
- Целочисленные типы наименьшей ширины, которые гарантированно будут наименьшим типом, доступным в реализации, который имеет как минимум указанное количество n бит. Гарантировано указано не менее N=8,16,32,64.
- Самые быстрые целочисленные типы, которые гарантированно будут самым быстрым целочисленным типом, доступным в реализации, который имеет как минимум указанное число n бит. Гарантировано указано не менее N=8,16,32,64.
- Целочисленные типы указателей, которые гарантированно смогут хранить указатель. Включается только в том случае, если он доступен в реализации.
- Целочисленные типы максимальной ширины, которые гарантированно будут самым большим целочисленным типом в реализации.
В следующей таблице приведены типы и интерфейсы для получения подробной информации о реализации ( n относится к количеству битов):
Тип категории | Знаковые типы | Беззнаковые типы | ||||
---|---|---|---|---|---|---|
Тип | Минимальное значение | Максимальное значение | Тип | Минимальное значение | Максимальное значение | |
Точная ширина | intn_t |
INTn_MIN |
INTn_MAX
|
uintn_t |
0 | UINTn_MAX
|
Наименьшая ширина | int_leastn_t |
INT_LEASTn_MIN |
INT_LEASTn_MAX
|
uint_leastn_t |
0 | UINT_LEASTn_MAX
|
Самый быстрый | int_fastn_t |
INT_FASTn_MIN |
INT_FASTn_MAX
|
uint_fastn_t |
0 | UINT_FASTn_MAX
|
Указатель | intptr_t |
INTPTR_MIN |
INTPTR_MAX
|
uintptr_t |
0 | UINTPTR_MAX
|
Максимальная ширина | intmax_t |
INTMAX_MIN |
INTMAX_MAX
|
uintmax_t |
0 | UINTMAX_MAX
|
Спецификаторы формата Printf и scanf
[ редактировать ]The <inttypes.h>
заголовок ( cinttypes
в C++) предоставляет функции, расширяющие функциональность типов, определенных в <stdint.h>
заголовок. Он определяет макросы для строк формата printf и спецификаторов строк формата scanf, соответствующих типам, определенным в <stdint.h>
и несколько функций для работы с intmax_t
и uintmax_t
типы. Этот заголовок был добавлен в C99 .
Строка формата Printf
[ редактировать ]Макросы имеют формат PRI{fmt}{type}
. Здесь {fmt} определяет форматирование вывода и является одним из d
(десятичный), x
(шестнадцатеричный), o
(восьмеричный), u
(без подписи) и i
(целое число). {type} определяет тип аргумента и является одним из n
, FASTn
, LEASTn
, PTR
, MAX
, где n
соответствует количеству битов в аргументе.
Строка формата Scanf
[ редактировать ]Макросы имеют формат SCN{fmt}{type}
. Здесь {fmt} определяет форматирование вывода и является одним из d
(десятичный), x
(шестнадцатеричный), o
(восьмеричный), u
(без подписи) и i
(целое число). {type} определяет тип аргумента и является одним из n
, FASTn
, LEASTn
, PTR
, MAX
, где n
соответствует количеству битов в аргументе.
Функции
[ редактировать ]Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( октябрь 2011 г. ) |
Дополнительные типы с плавающей запятой
[ редактировать ]Подобно целым типам фиксированной ширины, ISO/IEC TS 18661 определяет типы с плавающей запятой для обмена IEEE 754 и расширенные форматы в двоичном и десятичном формате:
_FloatN
для форматов двоичного обмена;_DecimalN
для десятичных форматов обмена;_FloatNx
для расширенных двоичных форматов;_DecimalNx
для десятичных расширенных форматов.
Структуры
[ редактировать ]Структуры объединяют хранилище нескольких элементов данных потенциально разных типов данных в один блок памяти, на который ссылается одна переменная. В следующем примере объявляется тип данных struct birthday
который содержит имя и день рождения человека. За определением структуры следует объявление переменной John
который выделяет необходимое хранилище.
struct birthday {
char name[20];
int day;
int month;
int year;
};
struct birthday John;
Расположение структуры в памяти — это проблема реализации языка для каждой платформы с некоторыми ограничениями. Адрес памяти первого члена должен совпадать с адресом самой структуры. Структуры могут быть инициализированы или назначены с использованием составных литералов. Функция может напрямую возвращать структуру, хотя во время выполнения это часто неэффективно. Начиная с C99 , структура может также заканчиваться гибким элементом массива .
Структура, содержащая указатель на структуру своего типа, обычно используется для построения связанных структур данных :
struct node {
int val;
struct node *next;
};
Массивы
[ редактировать ]Для каждого типа T
, кроме типов void и function, существуют типы "массив N
элементы типа T
" . Массив — это совокупность значений одного типа, хранящихся в памяти последовательно. Массив размером N
индексируется целыми числами из 0
до и включительно N−1
. Вот краткий пример:
int cat[10]; // array of 10 elements, each of type int
Массивы можно инициализировать с помощью составного инициализатора, но не присваивать. Массивы передаются функциям путем передачи указателя на первый элемент. Многомерные массивы определяются как «массив массива…» , и все измерения, кроме самого внешнего, должны иметь постоянный размер времени компиляции:
int a[10][8]; // array of 10 elements, each of type 'array of 8 int elements'
Указатели
[ редактировать ]Каждый тип данных T
имеет соответствующий указатель типа на T
. Указатель — это тип данных, который содержит адрес места хранения переменной определенного типа. Они объявлены звездочкой ( *
) описатель типа, следующий за базовым типом хранилища и предшествующий имени переменной. Пробелы до или после звездочки не являются обязательными.
char *square;
long *circle;
int *oval;
Указатели также могут быть объявлены для типов данных указателей, создавая таким образом несколько косвенных указателей, например символ ** и int *** , включая указатели на типы массивов. Последние встречаются реже, чем массив указателей, и их синтаксис может сбивать с толку:
char *pc[10]; // array of 10 elements of 'pointer to char'
char (*pa)[10]; // pointer to a 10-element array of char
Элемент pc
требуется десять блоков памяти размером с указатель на char
(обычно 40 или 80 байт на распространенных платформах), но элемент pa
представляет собой только один указатель (размером 4 или 8 байт), а данные, на которые он ссылается, представляют собой массив из десяти байтов ( sizeof *pa == 10
).
Союзы
[ редактировать ]Тип объединения — это специальная конструкция, которая разрешает доступ к одному и тому же блоку памяти, используя различные описания типов. Например, можно объявить объединение типов данных, позволяющее читать одни и те же данные как целое число, число с плавающей запятой или любой другой тип, объявленный пользователем:
union {
int i;
float f;
struct {
unsigned int u;
double d;
} s;
} u;
Общий размер u
размер u.s
– которая представляет собой сумму размеров u.s.u
и u.s.d
- с s
больше, чем оба i
и f
. При назначении чего-либо u.i
, некоторые части u.f
можно сохранить, если u.i
меньше, чем u.f
.
Чтение из члена объединения — это не то же самое, что приведение, поскольку значение члена не преобразуется, а просто считывается.
Указатели функций
[ редактировать ]Указатели на функции позволяют ссылаться на функции с определенной сигнатурой. Например, для хранения адреса стандартной функции abs
в переменной my_int_f
:
int (*my_int_f)(int) = &abs;
// the & operator can be omitted, but makes clear that the "address of" abs is used here
Указатели на функции вызываются по имени, как и обычные вызовы функций. Указатели на функции отличаются от указателей и указателей void .
Спецификаторы типа
[ редактировать ]Вышеупомянутые типы могут быть дополнительно охарактеризованы квалификаторами типа , что дает квалифицированный тип . По состоянию на 2014 год [update] и C11 , в стандарте C есть четыре квалификатора типа: const
( С89 ), volatile
( С89 ), restrict
( С99 ) и _Atomic
( C11 ) – последний имеет личное имя, чтобы избежать конфликта с именами пользователей, [14] но более обычное имя atomic
можно использовать, если <stdatomic.h>
заголовок включен. Из них const
на сегодняшний день является самым известным и наиболее используемым, появляющимся в стандартной библиотеке и встречающимся при любом значительном использовании языка C, который должен удовлетворять const-correctness . Остальные квалификаторы используются для низкоуровневого программирования и, хотя и широко там используются, типичными программистами используются редко. [ нужна ссылка ]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Барр, Майкл (2 декабря 2007 г.). «Портативные целые числа фиксированной ширины в C» . Проверено 18 января 2016 г.
- ^ Jump up to: а б Спецификация ISO/IEC 9899:1999, TC3 (PDF) . п. 255, § 7.18 Целочисленные типы <stdint.h> .
- ^ Jump up to: а б с д и ж г час я дж Спецификация ISO/IEC 9899:1999, TC3 (PDF) . п. 22, § 5.2.4.2.1 Размеры целочисленных типов <limits.h> .
- ^ Обоснование международного стандарта — Языки программирования — C, версия 5.10 (PDF) . п. 25, § 5.2.4.2.1 Размеры целочисленных типов <limits.h> .
- ^ Проект спецификации ISO/IEC 9899:2023 (PDF) . п. 41, § 6.2.6 Представления типов .
- ^ «Ограничения целых чисел C и C++» . 21 июля 2023 г.
- ^ Jump up to: а б Спецификация ISO/IEC 9899:1999, TC3 (PDF) . п. 37, § 6.2.6.1 Представления типов – Общие сведения .
- ^ Jump up to: а б с д и ж Спецификация ISO/IEC 9899:1999, TC3 (PDF) . п. 56, § 6.4.4.1 Целочисленные константы .
- ^ «64-битные модели программирования: почему LP64?» . Открытая группа . Проверено 9 ноября 2011 г.
- ^ «Ширина типа (Библиотека GNU C)» . www.gnu.org . Проверено 30 июля 2022 г.
- ^ "<limits.h>" . pubs.opengroup.org . Проверено 30 июля 2022 г.
- ^ Спецификация ISO/IEC 9899:1999, TC3 (PDF) . п. 67, § 6.5 Выражения .
- ^ Проект спецификации ISO/IEC 9899:2023 (PDF) . п. 37, § 6.2.5 Типы .
- ^ C11: Новый стандарт C , Томас Плам