Перейти к содержимому

Sizeof c что это

  • автор:

Оператор 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 вычисляет размер массива?

Как sizeof вычисляет размер массива, если передавая функции имя массива, по факту передается указатель на первый элемент, в данном случае sizeof получает указатель на int (sizeof (int) == 4). Откуда функция узнает количество элементов? По идеи при передаче sizeof указателя, должен возвращаться размер этого указателя (в моем случае 8).
sizeof(&arr[0]) == 8.
Как это все работает если // &arr[0] == arr
Выводят один и тот же адрес:

printf("%p\n", &arr[0]); printf("%p\n", arr);

А вот если вызывать sizeof с этими значениями то будет разные результаты.

printf("%zd\n", sizeof(&arr[0])); // Выводится размер указателя printf("%zd\n", sizeof(arr)); // Выводится размер всего массива, хотя и то и то являются адресами первого элемента
  • Вопрос задан более трёх лет назад
  • 8972 просмотра

Комментировать
Решения вопроса 0
Ответы на вопрос 1
Developer, ex-admin

sizeof — это не функция (хоть и выглядит похоже) — это операция взятия размера.
sizeof всегда вычисляется на этапе компиляции, т.е. в исполняемом файле вместо вызова sizeof уже будет вычисленная константа.
Когда компилятор знает размер массива, как в вашем примере, он вернет полный размер массива.
Но если передать в sizeof произвольный указатель (именно указатель, а не статический массив), он вернет размер указателя.

Статический массив — это не указатель. Указатель — на этапе выполнения занимает в памяти место для хранения адреса. Статический массив занимает в памяти место для хранения данных массива.
Поэтому статический массив — это не указатель. Хотя часто компилятор работает с именем статического массива как с указателем.

Ответ написан более трёх лет назад
Нравится 19 8 комментариев
dandropov95 @dandropov95 Автор вопроса

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

CityCat4

Имя массива не часто — оно всегда является указателем на первый элемент. Но Вас запутало то, что sizeof — не функция. sizeof -это число 🙂 Его аргументом являются только полностью определенные типы, поэтому еще на этапе компиляции sizeof(arr) превратится в sizeof(int) * SIZE. А вот sizeof(*(arr + 0)) — это явный запрос адреса, то есть если перевести на «человеческий» это будет — «хочу узнать размер ячейки, в которой записан адрес элемента arr+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 остались свободными во втором примере и почему?

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
  • Операторы инкремента ( ++ ) и декремента ( — — ). Составные операторы присваивания ( += , -= …)
  • Таблица приоритетности операций

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar