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

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

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

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

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

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

Массив и указатели. Вывести на экран весь массив и на отдельной строке - значение минимального элемента массива - C++
Нужна помощь, не знаю как сделать это задание. Написать программу, которая создает массив из 10 случайных целых чисел из отрезка . Вывести...

Указатели: написать функцию, проверяющую, является ли массив В подмножеством массива А - C++
Задача такая: Написать программу, которая содержит функцию, принимающую в качестве аргумента, указатели на два массива (А и В) и размеры...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Дан динамический одномерный массив размера N, изменить размер массива до M - C++
Что-то запуталась, как это делать, может, кто-нибудь знает? За помощь буду очень благодарна:)

Массив: каким образом можно изменить размер многомерного массива - C++
Я на 100% уверен что вопрос неоднократно поднимался до меня, поэтому заранее прошу прощения за эту тему.. Я просто ни как не могу найти...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.10.2012, 10:09 #2
1) В случае с [] массивом - можно, но стоит разложиться ему до указателя - и размер потерян,
2) Никак.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 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; }
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,848
25.10.2012, 10:15 #4
Цитата Сообщение от kalaider Посмотреть сообщение
Неужели никак нельзя узнать число элементов в массиве объектов, не заканчивающемся как строки нулевым байтом?
размер массива в байтах sizeof делить на размер элемента в байтах
например
C++
1
2
int array[100];
int size =sizeof(array)/sizeof(int);
1
Герц
524 / 341 / 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 автоматически выведется исходя из фактического параметра функции. Но полезность сомнительна.
0
ValeryS
25.10.2012, 10:18
  #6

Не по теме:

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

0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
25.10.2012, 10:29 #7
Цитата Сообщение от Герц Посмотреть сообщение
Интересный трюк, не думал что параметр шаблона int N автоматически выведется исходя из фактического параметра функции. Но полезность сомнительна.
"Это не я придумал"
Выводится не на всех компиляторах. В VC++6.0 не работает эта штука.
Ну а насчёт полезности, я думаю, что вполне может и пригодится.
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, а не через число элементов в них.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.10.2012, 10:38 #9
Нет, такой случай как ты описываешь не возможен. Если массив имеет нижележащий тип базового класса, то в нем можно хранить только элементы базового класса и sizeof будет возвращать их.
Чтобы хранить элементы и базового класса и наследуемых, нужно хранить указатели, а не экземпляры. А указатели всегда одного размера.
1
kalaider
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 31
25.10.2012, 10:41  [ТС] #10
Цитата Сообщение от Герц Посмотреть сообщение
нужно хранить указатели, а не экземпляры.
Ясно. Тогда и число элементов просто определить.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,848
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);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 11:14
Привет! Вот еще темы с ответами:

Из массива сформировать другой массив, размер которого два раза меньше. - C++
6. Дан массив чисел размерностью 20, тип данных int, из этого массива сформировать другой массив, размер которого два раза меньше.

Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива - C++
Создайте новую версию класса Stack с конструктором по умолчанию и вторым конструктором, в аргументах которого передается массив указателей...

Создайте класс Array с двумя полями: указатель на массив целых чисел и размер массива - C++
. В классе хранится только указатель на массив, сами данные хранятся в динамической области памяти, выделенной оператором new. Напишите...

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны. - C++
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив - равны.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.10.2012, 11:14
Ответ Создать тему
Опции темы

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