Оператор sizeof (C)
Оператор sizeof предоставляет объем хранения (в байтах), необходимого для хранения объекта типа «операнд». Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах.
Синтаксис
sizeof unary-expression sizeof ( type-name )
Примечания
Операнд является либо любым идентификатором unary-expression, либо выражением type-cas (то есть описателем типа, заключенным в скобки). unary-expression не может представлять объект битового поля, неполный тип или указатель функции. Результатом является целочисленная константа без знака. Стандартный заголовок STDDEF.H определяет этот тип как size_t.
При применении оператора sizeof к идентификатору массива результатом является размер целого массива, а не размер указателя, представленного идентификатором массива.
При применении оператора sizeof к имени структуры или типа объединения, идентификатору структуры или типа объединения, результатом является число байтов в структуре или объединении, включая внутреннее и конечное заполнение. Этот размер может включать внутреннее и конечное заполнение, используемое для выравнивания элементов структуры или объединения относительно границ памяти. Таким образом, результат может не соответствовать размеру, вычисленному путем добавления требований к хранению отдельных элементов.
Если безразмерный массив является последним элементом структуры, оператор sizeof возвращает размер структуры без массива.
buffer = calloc(100, sizeof (int) );
В этом примере для передачи размера объекта sizeof , который меняется в зависимости от компьютеров, как аргумент функции времени выполнения с именем int , используется оператор calloc . Значение, возвращаемое функцией, хранится в buffer .
static char *strings[] = < "this is string one", "this is string two", "this is string three", >; const int string_no = ( sizeof strings ) / ( sizeof strings[0] );
В этом примере strings — это массив указателей на char . Число указателей — это число элементов в массиве, но оно не определено. Легко определить количество указателей с помощью оператора sizeof , вычислив число элементов в массиве. Значение целого числа const string_no инициализируется до этого числа. Поскольку это значение const , string_no невозможно изменить.
Оператор sizeof
sizeof — это унарный оператор, возвращающий длину в байтах переменной или типа, помещенных в скобки. Например:
float f;
printf(«%f «, sizeof f);
printf(«%d», sizeof(int));
выдает 4 2. (Предполагается использование 16-битных целых.)
Помните, что для вычисления размера типа следует поместить имя типа в круглые скобки. В этом нет необходимости для имен переменных.
Использование sizeof помогает создавать переносимый код для тех случаев, когда код зависит от размера стандартных типов данных С. Например, представим, что программе, работающей с базой данных, необходимо сохранять 6 целочисленных значений в записи. Для того, чтобы сделать эту программу переносимой, не следует предполагать, что размер целочисленного типа — 2 или 4 байта, следует самостоятельно определить настоящую длину, используя sizeof. Следующая подпрограмма может быть использована для сохранения записи в файле:
/* Запись записи в файл */
void put_rec(FILE *fp, int rec[6])
int size, num;
size = sizeof(int) * 6;
num = fwrite(rec, size, 1, fp) ;
if(num!=1) printf(«ошибка записи»);
>
Самое главное в этом примере то, что put_rec() будет компилироваться и корректно запускаться на любом компьютере, включая компьютеры, использующие 2- и 4-байтные целые.
Оператор sizeof
Возвращает размер операнда относительно размера типа char .
Дополнительные сведения об операторе см. в разделе «Многоточие sizeof . » и «Шаблоны вариативных».
Синтаксис
sizeof unary-expression sizeof ( type-name )
Замечания
Результатом sizeof оператора является тип size_t , целочисленный тип, определенный в файле include stddef.h><. Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах.
Операнд, который sizeof может быть одним из следующих элементов:
- Имя типа. Чтобы использовать sizeof имя типа, имя должно быть заключено в скобки.
- Выражение . При использовании с выражением sizeof можно указать скобки или без нее. Значение выражения не вычисляется.
sizeof Когда оператор применяется к объекту типа char , он возвращает значение 1. sizeof Если оператор применяется к массиву, он выдает общее количество байтов в этом массиве, а не размер указателя, представленного идентификатором массива. Чтобы получить размер указателя, представленного идентификатором массива, передайте его в качестве параметра в функцию, которая использует sizeof . Например:
Пример
#include using namespace std; size_t getPtrSize( char *ptr ) < return sizeof( ptr ); >int main()
Образец вывода
The size of a char is: 1 The length of Hello, world! is: 14 The size of the pointer is 4
sizeof Если оператор применяется к class типу или struct union типу, результатом является число байтов в объекте этого типа, а также любое заполнение, добавленное для выравнивания элементов по границам слова. Результат не обязательно должен соответствовать размеру, вычисляемому путем добавления требований к хранению отдельных членов. Параметр компилятора /Zp и pragma пакета влияют на границы выравнивания элементов.
Оператор sizeof никогда не дает 0, даже для пустого класса.
Оператор sizeof нельзя использовать со следующими операндами:
- Функции. (Однако sizeof можно применить к указателям на функции.)
- Битовые поля.
- Неопределенные классы.
- Тип void .
- Динамически создаваемые массивы.
- Внешние массивы.
- Неполные типы.
- Заключенные в скобки имена неполных типов.
sizeof Если оператор применяется к ссылке, результат такой же, как если бы sizeof он был применен к самому объекту.
Если безразмерный массив является последним элементом структуры, оператор sizeof возвращает размер структуры без массива.
Оператор sizeof часто используется для вычисления количества элементов в массиве с помощью выражения формы:
sizeof array / sizeof array[0]
Урок 4.Массивы и оператор sizeof
Всем привет! Как и обещал, пищу о массивах и о операторе sizeof. Начнем с массивов. В третьем уроке мы рассмотрели один вариант массива, а сегодня рассмотрим и второй. Массив — это совокупность данных одного типа. То есть вы объявляете множество переменных одного типа. Рассмотрим это на примере.
#include int main ()< int a[3][2]=,,>; double b[5][6]; printf ("a=%d\n", a[0][0]); b[4][5]=10; /*Присваиваем значение 10 массиву b[4][5]*/ printf ("b=%f\n", b[4][5]); return 0; >
Начнем с четвертой строки. Там мы объявляем переменную типа int. Но как вы могли заметить она имеет не обычную конструкцию. Это и есть Массив. После объявления массива у нас идут две квадратные скобки. Это называется ключом. В первой мы указываем количество скобок которые идут после знака равно, а во втором количество значений в каждой скобке. Как видно, у нас в первых квадратных скобках значение 3, и соответственно после знака равно идет одна «большая» скобка, внутри которого содержится три более «маленьких» скобок. Во второй квадратной скобке у нас цифра два, соответственно в «маленьких» скобках по два значения. Обратите внимание, скобки и значения в них разделены запятыми.
В пятой строке у нас опять массив. Но на этот раз мы не присваиваем значения. Это мы можем сделать позднее, например у нас в седьмой строке.
В шестой и восьмой строке мы выводим информацию на экран. Повторяю еще раз, нумерация при выводе и вводе (ввод рассмотрим в следующем уроке) начинается с нуля.
sizeof
Оператор sizeof используется для вывода количества памяти в байтах, которая выделяется для хранения информации. В зависимости от разрядности операционной системы выделяется разное количество памяти. Вот пример использования оператора sizeof.
#include int main (void)
Результат выполнения программы на 64-битной платформе:
b=4 int=4 char=1 short=2 double=8 long=8
Цифры это количество памяти в байтах, выделенных для данного типа переменных. На 16-ти и 32-х битных платформах результат будет другим.
Д/З:
Сколько переменных f остались свободными во втором примере и почему?