Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sizeof 
V
    Опции темы
Hagrael
Дата 2.7.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Есть код:
Код

int arr[10];
cout << sizeof(arr);

Он выдает "40". Все логично, но как компьютер узнает количество ячеек массива?
Тем более, в этом случае:
Код

char* p="one";
cout << sizeof(p);


Это сообщение отредактировал(а) Hagrael - 2.7.2011, 16:25
PM MAIL   Вверх
Dem_max
Дата 2.7.2011, 19:51 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



в процессе компиляции уже знает.

Цитата

sizeof(p)

это размер адреса, для 32 битной адресации это 4 байта


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Hagrael
Дата 3.7.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Цитата(Dem_max @  2.7.2011,  19:51 Найти цитируемый пост)
в процессе компиляции уже знает.

Т. е. гипотетически вместо функции sizeof(variable) во время компиляции подставляется array_size * array_length?
PM MAIL   Вверх
Dem_max
Дата 3.7.2011, 12:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



угу, если конечно у тебя это
array_size  - размерность типа данных
array_length - количество элементов в массиве.



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
volatile
Дата 3.7.2011, 12:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Hagrael @  3.7.2011,  09:59 Найти цитируемый пост)
вместо функции sizeof(variable)

Вообще-то sizeof это не функция, формально это оператор. 
все sizeof'ы заменяются компилятором на числа, которые подставляются во время компиляции.
sizeof - означает размер <чего либо> в чарах.



PM MAIL   Вверх
volatile
Дата 3.7.2011, 12:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Hagrael @  2.7.2011,  16:20 Найти цитируемый пост)
int arr[10];
cout << sizeof(arr);

Кстати, еще один пример что это не функция.
с переменными (но не с типами) можно писать так:
cout << sizeof arr;
т.е. без скобок.
если же тип, то скобки обязательны
cout << sizeof(int);

PM MAIL   Вверх
Hagrael
Дата 3.7.2011, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Разобрался! Большое спасибо, Dem_max и volatile!
PM MAIL   Вверх
Сыроежка
Дата 3.7.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  3.7.2011,  12:10 Найти цитируемый пост)
Вообще-то sizeof это не функция, формально это оператор. 
все sizeof'ы заменяются компилятором на числа, которые подставляются во время компиляции.
sizeof - означает размер <чего либо> в чарах.


Это не совсем так. Для массивов переменной длины в языке С sizeof вычисляется во время выполнения программы.
PM MAIL   Вверх
Dem_max
Дата 3.7.2011, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

Это не совсем так. Для массивов переменной длины в языке С sizeof вычисляется во время выполнения программы.

Это неверно, sizeof всегда вычисляется на стадии компиляции.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 3.7.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dem_max @  3.7.2011,  16:42 Найти цитируемый пост)
Это неверно, sizeof всегда вычисляется на стадии компиляции. 

это так в C++ , а в С имеются еще массивы переменной длины, которые  также нуждаются в sizeof'е, но не могут знать свой размер на стадии компиляции.. 
http://liveworkspace.org/code/2969fc76b137...9fee9d917170e30

Это сообщение отредактировал(а) mes - 3.7.2011, 18:00


--------------------
PM MAIL WWW   Вверх
Сыроежка
Дата 3.7.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(Dem_max @  3.7.2011,  17:42 Найти цитируемый пост)
Это неверно, sizeof всегда вычисляется на стадии компиляции


И как вы собираетесь вычислить размер массива в следующем примере на этапе компиляции?!!!

Код

void f( size_t n )
{
   int a[n];
}

PM MAIL   Вверх
Dem_max
Дата 3.7.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



хотя да - это исключение из правил стандарта С99

Это сообщение отредактировал(а) Dem_max - 3.7.2011, 18:14


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Hagrael
Дата 4.7.2011, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Появился еще один вопрос, который я получил после изучения оператора sizeof: При передаче массива в функцию массив принимается как указатель, а можно ли сделать так, чтобы он копировался? (не копировать вручную, а какой-нибудь префикс поставить)
PM MAIL   Вверх
volatile
Дата 4.7.2011, 06:49 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Hagrael, простой массив просто так нельзя скопировать. Для этого нужно писать код, просто префиксом не обойтись.
Если нужно копировать, при передаче в функцию, лучше применять STL-овские массивы.

Добавлено через 1 минуту и 55 секунд
Цитата(Сыроежка @  3.7.2011,  15:41 Найти цитируемый пост)
Для массивов переменной длины в языке С 

Не понятно, причем здесь вообще С. 
Или в С уже появился cout  smile 
Цитата(Hagrael @  2.7.2011,  16:20 Найти цитируемый пост)
int arr[10];
cout << sizeof(arr);


PM MAIL   Вверх
xvr
Дата 4.7.2011, 13:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Hagrael @  4.7.2011,  06:25 Найти цитируемый пост)
а можно ли сделать так, чтобы он копировался?

Нет, но можно завернуть его в структуру и передать:
Код

int array[10];
call(array); // No copy of array will be crerated

struct A {
 int array[10];
};

A a;
call(a); // Call by value - whole A will be duplicated, including 'array'


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.