| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > sizeof |
| Автор: Hagrael 2.7.2011, 16:20 | ||||
Есть код:
Он выдает "40". Все логично, но как компьютер узнает количество ячеек массива? Тем более, в этом случае:
|
| Автор: Dem_max 2.7.2011, 19:51 | ||
в процессе компиляции уже знает.
это размер адреса, для 32 битной адресации это 4 байта |
| Автор: Hagrael 3.7.2011, 09:59 |
Т. е. гипотетически вместо функции sizeof(variable) во время компиляции подставляется array_size * array_length? |
| Автор: Dem_max 3.7.2011, 12:01 |
| угу, если конечно у тебя это array_size - размерность типа данных array_length - количество элементов в массиве. |
| Автор: volatile 3.7.2011, 12:10 |
Вообще-то sizeof это не функция, формально это оператор. все sizeof'ы заменяются компилятором на числа, которые подставляются во время компиляции. sizeof - означает размер <чего либо> в чарах. |
| Автор: volatile 3.7.2011, 12:31 |
Кстати, еще один пример что это не функция. с переменными (но не с типами) можно писать так: cout << sizeof arr; т.е. без скобок. если же тип, то скобки обязательны cout << sizeof(int); |
| Автор: Hagrael 3.7.2011, 13:49 |
| Разобрался! Большое спасибо, Dem_max и volatile! |
| Автор: Dem_max 3.7.2011, 17:42 | ||
Это неверно, sizeof всегда вычисляется на стадии компиляции. |
| Автор: mes 3.7.2011, 17:58 |
это так в C++ , а в С имеются еще массивы переменной длины, которые также нуждаются в sizeof'е, но не могут знать свой размер на стадии компиляции.. http://liveworkspace.org/code/2969fc76b137ae4d29fee9d917170e30 |
| Автор: Сыроежка 3.7.2011, 18:04 | ||
И как вы собираетесь вычислить размер массива в следующем примере на этапе компиляции?!!!
|
| Автор: Dem_max 3.7.2011, 18:13 |
| хотя да - это исключение из правил стандарта С99 |
| Автор: Hagrael 4.7.2011, 06:25 |
| Появился еще один вопрос, который я получил после изучения оператора sizeof: При передаче массива в функцию массив принимается как указатель, а можно ли сделать так, чтобы он копировался? (не копировать вручную, а какой-нибудь префикс поставить) |
| Автор: volatile 4.7.2011, 06:49 |
| Hagrael, простой массив просто так нельзя скопировать. Для этого нужно писать код, просто префиксом не обойтись. Если нужно копировать, при передаче в функцию, лучше применять STL-овские массивы. Добавлено через 1 минуту и 55 секунд Не понятно, причем здесь вообще С. Или в С уже появился cout |
| Автор: xvr 4.7.2011, 13:20 | ||
Нет, но можно завернуть его в структуру и передать:
|