Форум программистов, компьютерный форум CyberForum.ru

Размер массива и указатели на массив - C++

Восстановить пароль Регистрация
 
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
25.10.2012, 10:07     Размер массива и указатели на массив #1
Я программировал на Java. Размер массива всегда можно было получить. Теперь изучаю C++. Столкнулся с проблемой получения размера массива. Он создаётся, соответственно где-то записан его размер. При удалении массива удаляется весь массив. Значит компилятор (или что-то ещё) знает его размер?
1) Неужели никак нельзя узнать число элементов в массиве объектов, не заканчивающемся как строки нулевым байтом?
2) Как определить, что указатель ссылается на массив?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 10:07     Размер массива и указатели на массив
Посмотрите здесь:

C++ Массив и указатели. Вывести на экран весь массив и на отдельной строке - значение минимального элемента массива
Ввести размер массива с клавиатуры и передать этот размер в конструктор C++
C++ Массив: каким образом можно изменить размер многомерного массива
C++ Создайте класс Array с двумя полями: указатель на массив целых чисел и размер массива
Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.10.2012, 10:09     Размер массива и указатели на массив #2
1) В случае с [] массивом - можно, но стоит разложиться ему до указателя - и размер потерян,
2) Никак.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.10.2012, 10:13     Размер массива и указатели на массив #3
C++
1
2
int Array[] = {1, 2, 3, 4};
int Size = sizeof(Array)/sizeof(Array[0]);
Я, правда, не уверен, что это работает везде.

Можно ещё с помощью шаблона:
C++
1
2
template <int N>
int Size(int (&Arr)[N]) { return N; }
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
25.10.2012, 10:15     Размер массива и указатели на массив #4
Цитата Сообщение от kalaider Посмотреть сообщение
Неужели никак нельзя узнать число элементов в массиве объектов, не заканчивающемся как строки нулевым байтом?
размер массива в байтах sizeof делить на размер элемента в байтах
например
C++
1
2
int array[100];
int size =sizeof(array)/sizeof(int);
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.10.2012, 10:16     Размер массива и указатели на массив #5

Не по теме:

любите вы давать ответы, которые уже даны :-)


C++
1
2
template <int N>
int Size(int (&Arr)[N]) { return N; }
Интересный трюк, не думал что параметр шаблона int N автоматически выведется исходя из фактического параметра функции. Но полезность сомнительна.
ValeryS
25.10.2012, 10:18
  #6

Не по теме:

Цитата Сообщение от Герц Посмотреть сообщение
любите вы давать ответы, которые уже даны :-)
это почему то твои посты раньше оказываются

John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.10.2012, 10:29     Размер массива и указатели на массив #7
Цитата Сообщение от Герц Посмотреть сообщение
Интересный трюк, не думал что параметр шаблона int N автоматически выведется исходя из фактического параметра функции. Но полезность сомнительна.
"Это не я придумал"
Выводится не на всех компиляторах. В VC++6.0 не работает эта штука.
Ну а насчёт полезности, я думаю, что вполне может и пригодится.
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
25.10.2012, 10:35  [ТС]     Размер массива и указатели на массив #8
Цитата Сообщение от John Prick Посмотреть сообщение
int Array[] = {1, 2, 3, 4}; int Size = sizeof(Array)/sizeof(Array[0]);
А если массив объектов разного размера? Например, два экземпляра базового класса и один производного с новыми переменными? Тогда - ошибка. Или такое в c++ не допускается?

---

Наверное, массивы через sizeof, а не через число элементов в них.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.10.2012, 10:38     Размер массива и указатели на массив #9
Нет, такой случай как ты описываешь не возможен. Если массив имеет нижележащий тип базового класса, то в нем можно хранить только элементы базового класса и sizeof будет возвращать их.
Чтобы хранить элементы и базового класса и наследуемых, нужно хранить указатели, а не экземпляры. А указатели всегда одного размера.
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
25.10.2012, 10:41  [ТС]     Размер массива и указатели на массив #10
Цитата Сообщение от Герц Посмотреть сообщение
нужно хранить указатели, а не экземпляры.
Ясно. Тогда и число элементов просто определить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 11:14     Размер массива и указатели на массив
Еще ссылки по теме:

Массивы и указатели (нужно передать массив I[10] в массив J[10] в обратной последовательности) C++
Как в массив скопировать массив, который заполнен через указатели C++
Дан динамический одномерный массив размера N, изменить размер массива до M C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
25.10.2012, 11:14     Размер массива и указатели на массив #11
Цитата Сообщение от kalaider Посмотреть сообщение
А если массив объектов разного размера? Например, два экземпляра базового класса и один производного с новыми переменными? Тогда - ошибка.
тогда это называется структура
например вот это
C++
1
int arr[4];
и это
C++
1
2
3
4
5
6
7
struct str
{
int a0;
int a1;
int a2;
int a3;
}
даст одинаковый размер( и чаще всего скомпилируется в один и тот же код)
но вот это
C++
1
2
3
4
5
6
7
struct str1
{
int a0;
double a1;
char a2;
short a3;
}
возможно только в структуре

но если будет массив структур то размер ( в стуктурах ) узнаем так же

C++
1
2
str1 arrS[10];
size =sizeof(arrS)/sizeof(str1);
Yandex
Объявления
25.10.2012, 11:14     Размер массива и указатели на массив
Ответ Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru