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

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

Войти
Регистрация
Восстановить пароль
 
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
#1

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

25.10.2012, 10:07. Просмотров 766. Ответов 10
Метки нет (Все метки)

Я программировал на Java. Размер массива всегда можно было получить. Теперь изучаю C++. Столкнулся с проблемой получения размера массива. Он создаётся, соответственно где-то записан его размер. При удалении массива удаляется весь массив. Значит компилятор (или что-то ещё) знает его размер?
1) Неужели никак нельзя узнать число элементов в массиве объектов, не заканчивающемся как строки нулевым байтом?
2) Как определить, что указатель ссылается на массив?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 10:07     Размер массива и указатели на массив
Посмотрите здесь:
C++ Массив и указатели. Вывести на экран весь массив и на отдельной строке - значение минимального элемента массива
Указатели: написать функцию, проверяющую, является ли массив В подмножеством массива А C++
Дан динамический одномерный массив размера N, изменить размер массива до M C++
C++ Массив: каким образом можно изменить размер многомерного массива
C++ Из массива сформировать другой массив, размер которого два раза меньше.
Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива C++
C++ Создайте класс Array с двумя полями: указатель на массив целых чисел и размер массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.10.2012, 10:09     Размер массива и указатели на массив #2
1) В случае с [] массивом - можно, но стоит разложиться ему до указателя - и размер потерян,
2) Никак.
John Prick
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 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
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,624
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
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 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     Размер массива и указатели на массив
Еще ссылки по теме:
Ввести размер массива с клавиатуры и передать этот размер в конструктор C++
Как в массив скопировать массив, который заполнен через указатели C++
C++ Задача на массив и указатели.(массив из случайных чисел)
C++ Найти минимальный элемент массива (через указатели, запрещено обращаться к элементам массива по индексам)
C++ массив и указатели

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,624
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     Размер массива и указатели на массив
Ответ Создать тему
Опции темы

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