Оператор 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]
C++. Операция sizeof. Операция ?:
Операция sizeof предназначена для определения размера типа данных, переменной базового типа, переменной структурного типа, числового значения, строчного значения и т.п.
Операция sizeof есть полезной в случаях, когда необходимо динамически выделять память для переменных. В этом случае нужно знать объем памяти, которую занимает объект того или другого типа.
Общий вид операции sizeof :
sizeof(тип_или_переменная)
- тип_или_переменная – название типа данных или переменной (объекта), которая используется на данный момент в программе.
2. Примеры использования операции sizeof для базовых типов и числовых значений
В приведенном ниже фрагменте кода приведен пример определения размера переменной базового типа, числового значения, строчного значения или результата выражения.
// операция sizeof int a; short int b; float x; double y; long double z; int size; size = sizeof(b); // size = 2 size = sizeof(int); // size = 4 size = sizeof(a); // size = 4 size = sizeof(x); // size = 4 size = sizeof(double); // size = 8 size = sizeof(z); // size = 8 size = sizeof(long double); size = sizeof(bool); // size = 1 size = sizeof(true); // size = 1 size = sizeof(28); // size = 4 - как тип int size = sizeof(9.8 + 5); // size = 8 - как тип double size = sizeof("Hello world!"); // size = 13 size = sizeof('\n'); // size = 1
3. Как определить размер структурной переменной? Пример
Пусть задана структурная переменная, описывающая данные о студенте. Шаблон структуры описывается в отдельном файле «MyStruct_Student.h» :
struct Student < char name[70]; int age; char address[100]; >;
Тогда, чтобы определить объем памяти, который выделяется для переменной типа struct Student , можно написать следующий программный код:
#include "MyStruct_Student.h" . // определение размера структурной переменной int size; Student ST; size = sizeof(struct Student); // size = 176 size = sizeof(ST); // size = 176 .
4. Как определить размер массива чисел? Пример
// определение размера массива int A[100]; // массив из 100 целых чисел float X[200]; // массив из 200 вещественных чисел int size; size = sizeof(A); // size = 4 * 100 = 400 size = sizeof(X); // size = 4 * 200 = 800
5. Как определить размер массива структур? Пример
Пусть задана структурная переменная, описывающая данные о студенте. Шаблон структуры описывается в отдельном файле «MyStruct_Student.h» :
struct Student < char name[70]; int age; char address[100]; >;
Программный код, который определяет размер массива из 100 структурных переменных типа Student , будет иметь следующий вид:
#include "MyStruct_Student.h" . // определение размера массива структур Student A[100]; // массив из 100 структур типа Student int size; size = sizeof(A); // size = 176 * 100 = 17600
6. Как определить размер объекта (экземпляра) класса? Пример
Пусть в модуле «MyClass.h» описывается класс с именем MyPoint :
class MyPoint < private: int x, y; public: int GetX(void) < return x; > int GetY(void) < return y; > void SetXY(int nx, int ny) < x = nx; y = ny; return; > >;
Чтобы определить размер памяти, которая выделяется для объекта этого класса, нужно написать такой программный код:
#include "MyClass.h" . // размер объекта класса MyPoint P1; int size; size = sizeof(P1); // size = 8 size = sizeof(MyPoint); // size = 8 .
Как видно из результата, операция sizeof() определяет объем памяти, который выделяется под переменные (поля) класса.
7. Как определить размер массива объектов класса? Пример
Пусть в модуле «MyClass.h» описывается класс с именем MyPoint :
class MyPoint < private: int x, y; public: int GetX(void) < return x; > int GetY(void) < return y; > void SetXY(int nx, int ny) < x = nx; y = ny; return; > >;
Тогда, фрагмент программного кода, который определяет размер массива из 20 объектов класса MyPoint , будет иметь вид:
#include "MyClass.h" . // размер массива объектов класса MyPoint P1[20]; int size; size = sizeof(P1); // size = 8 * 20 = 160 .
8. Какой общий вид в программе имеет тернарная операция ? : ?
Тернарная операция ? : может заменять оператор условного перехода if … else . Общий вид операции ? : следующий:
выражение1 ? выражение2 : выражение3
- выражение1 – любое логическое выражение, результатом которого есть значение true или false ;
- выражение2 – выражение, которое будет вычисляться, если значение выражение1 = true ;
- выражение3 – выражение, которое будет вычисяться, если значение выражение1 = false .
9. Примеры использования операции ? :
В нижеследующем фрагменте кода вычисляется минимальное значение между двумя переменными a и b :
// операция ? : // минимальное значение между двумя числами int a, b; int min; a = 15; b = 8; min = a > b ? b : a; // min = 8
Связанные темы
- Оператор условного перехода if
- Оператор выбора switch
- Операторы инкремента ( ++ ) и декремента ( — — ). Составные операторы присваивания ( += , -= …)
- Таблица приоритетности операций
Оператор 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 невозможно изменить.
Урок 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 остались свободными во втором примере и почему?