Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
cppuser
0 / 0 / 0
Регистрация: 03.09.2011
Сообщений: 4
#1

sizeof и количество элементов в массиве - C++

03.09.2011, 14:57. Просмотров 2305. Ответов 14
Метки нет (Все метки)

Доброе время суток. Подскажите пожалуйста почему sizeof не возвоащает кол.элементов в массиве.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int main()
{
    using namespace std;
    short int symbols[] = {34,6,4,6,3,43,2,55,12,432,54,34,543,234,432};
    int a;
 
    cout << "sizeof(symbols)" << sizeof(symbols) << "\n";
    cout << "sizeof(int)" << sizeof(int) << "\n";
    cout << sizeof(symbols) / sizeof(short int);
 
    cin >> a;
 
    return 0;
}
sizeof(symbols) - возвращает 30
sizeof(int) - размер байтах.

что значит 30 и почему 30 / 4 = 15 ?
И подскажите пожалуйста мануал по работе с массивами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2011, 14:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос sizeof и количество элементов в массиве (C++):

С помощью sizeof определить количество элементов в целом массиве - C++
С помощью sizeof определить количество элементов в целом массиве

Определение количества элементов в динамическом массиве оператором sizeof() - C++
Как с помощью sizeof() определить, сколько элементов находится в массиве?

Sizeof(.) или constexpr size_t tmp = sizeof(.) - C++
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов. - C++
1. В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов. Число N и...

в массиве . найти произведение ненулевых элементов, количество элементов, превышающих значение среднего арифметического элементов массива - C++
В массиве Х(N) найти произведение ненулевых элементов, количество элементов, превышающих значение среднего арифметического элементов...

в массиве . найти произведение нулевых элементов, количество элементов, превышающих значение среднего арифметического элементов массива - C++
В массиве Х(N) найти произведение нулевых элементов, количество элементов, превышающих значение среднего арифметического элементов массива....

14
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
03.09.2011, 15:04 #2
Цитата Сообщение от cppuser Посмотреть сообщение
sizeof(symbols) - возвращает 30
Это размер массива в байтах.

Цитата Сообщение от cppuser Посмотреть сообщение
sizeof(int) - размер байтах.
И это размер в байтах. Для типа int.


Цитата Сообщение от cppuser Посмотреть сообщение
что значит 30 и почему 30 / 4 = 15 ?
30 байт потому, что каждый элемент типа short int в данном случае имеет размер 2 байта.
30/2 = 15. А на 4 делить не надо, ведь int это не short int

Добавлено через 2 минуты
В C++ для определения размера не динамических массивов можно использовать вот такую функцию
1
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 17:51 #3
Цитата Сообщение от grizlik78 Посмотреть сообщение
Это размер массива в байтах.
- в дополнение скажу что sizeof применим лишь для статических массивов, например для такого массива
int * mass = new int[n];
sizeof(mass) - не вернёт его размер...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 19:44 #4
Цитата Сообщение от grizlik78 Посмотреть сообщение
В C++ для определения размера не динамических массивов можно использовать вот такую функцию
А можно написать _countof .)
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
03.09.2011, 20:05 #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
А можно написать _countof .)
Можно, но это не из C++
К тому же при попытке использования с указателем _countof молча вернёт неправильный результат, в отличие от array_size(), с которым компилятор укажет на ошибку компиляции.

Добавлено через 2 минуты
Хотя нет, погорячился я. В C++ этот макрос определён как раз аналогично array_size. Но в случае не-Windows всё-равно придётся самостоятельно определять.

Добавлено через 6 минут
Даже, скорее, не не-Windows, а не-Microsoft
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 20:08 #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Даже, скорее, не не-Windows, а не-Microsoft
Но выше указанная функция не compile-time (новый стандарт не в счёт). А _countof И аналогичные работают в compile-time.
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
03.09.2011, 20:20 #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Но выше указанная функция не compile-time (новый стандарт не в счёт). А _countof И аналогичные работают в compile-time.
Ну что же, возможно для MSVC и нужен столь запутанный вариант, но за GCC я спокоен, там и предыдущая версия функции вычисляется в compile-time.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 20:30 #8
Цитата Сообщение от grizlik78 Посмотреть сообщение
там и предыдущая версия функции вычисляется в compile-time
Т.е. и в предыдущей версии gcc можно записать?
C++
1
2
int arrayA[] = {...};
int arrayB[ ArraySize(a) ];
Поддержка подобного кода появилась только в новом стандарте (я даже ключевого слова ещё не запомнил).
1
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
03.09.2011, 20:39 #9
А, ты про VLA... Да, наверное в этом случае результат функции array_size будет считаться неконстантным, ибо в compile-time её вычисляет уже оптимизатор, а тогда уже может оказаться поздно. Ладно, будем считать, что убедил.
0
Сыроежка
Заблокирован
03.09.2011, 20:53 #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- в дополнение скажу что sizeof применим лишь для статических массивов, например для такого массива
int * mass = new int[n];
sizeof(mass) - не вернёт его размер...
У вас нет массива mass. mass - это указатель на выделенную память, а не массив. Так что ваше утверждение просто некорректное.
0
asics
03.09.2011, 21:30
  #11

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Поддержка подобного кода появилась только в новом стандарте
Цитата Сообщение от grizlik78 Посмотреть сообщение
А, ты про VLA...
VLA есть в С++11 ?

0
grizlik78
03.09.2011, 21:35
  #12

Не по теме:

Цитата Сообщение от asics Посмотреть сообщение
VLA есть в С++11 ?
Не видел, лень искать. Но по мнению g++ в c++0x его тоже нет, то есть это чисто GCC-шное расширение.

0
asics
03.09.2011, 21:44
  #13

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
я даже ключевого слова ещё не запомнил
Не constexpr ли он имеет ввиду

0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 01:06 #14
Цитата Сообщение от Deviaphan Посмотреть сообщение
(я даже ключевого слова ещё не запомнил)
constexpr.
в некотором коммерческом проекте, при помощи этой возможности, я реализовал класс mpl_string и набор constexpr функций, и на основе всего этого, реализовал compile-time парсер для строк.

Добавлено через 3 минуты
надеюсь заказчик позволит опубликовать этот код как OpenSource. для многих это будет как минимум познавательно. для более пытливых, примером реально работающего compile-time парсера.
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 07:42 #15
Да-да, именно constexpr запомнить и не могу.
Жаль, что в MSVC поддержки пока нету.(

Добавлено через 2 минуты
Цитата Сообщение от asics Посмотреть сообщение
VLA есть в С++11 ?
Не-не-не, я нt про VLA (у меня стд::ввектор есть для этих целей). Я про constexpr.
0
04.09.2011, 07:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 07:42
Привет! Вот еще темы с ответами:

В массиве А(n) (n<=7) хотя бы один нуль. Определить количество положительных и количество отрицательных элементов к первому нулю. - C++
В массиве А(n) (n&lt;=7) хотя бы один нуль. Определить количество положительных и количество отрицательных элементов к первому нулю.

В массиве из 50 элементов определить количество элементов, кратных 6 и найти минимальный элемент - C++
В массиве из 50 элементов определить количество элементов, кратных 6 и найти минимальный элемент. Помогите, кто сможет. Нужно в C++

В одномерном массиве состоящий из n элементов вычислить количество элементов массива, меньших C - C++
:::::::

В одномерном массиве, состоящем из n вещественных элементов, вычислить количество отрицательных элементов массива - C++
В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) количество отрицательных элементов массива; 2) сумму модулей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru