0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 18
|
||||||
1 | ||||||
Использование указателей02.08.2009, 20:39. Показов 2345. Ответов 22
Метки нет (Все метки)
Всем привет, вот изучаю помалу С++. И уже третий час немогу впарится в Указатели недаётся мне это, вот вроде более менее разобрался, скажите правильно нет:
0
|
02.08.2009, 20:39 | |
Ответы с готовыми решениями:
22
Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя. использование указателей Использование указателей использование указателей |
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
|
|
02.08.2009, 20:43 | 2 |
Ага.
Но можешь сам проверить. Вывод строк 8 и 12, а также строк 9 и 11 должен быть одинаковым.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
02.08.2009, 21:25 | 3 |
2Nessaj: Если уж начал разбираться с указателями - давай еще ссылки освой.
Добавь сюда еще rAge - ссылку на myAge. Добавлено через 40 секунд А еще указатели на массивы тоже освой. Массив of char и массив of int.
0
|
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
|
|||||||||||
04.08.2009, 22:26 | 5 | ||||||||||
Еще объясните мне по указателям...
Почитал, посмотрел, понял что указатели хорошо использовать при передачи параметров функции например, что бы не тратить время на копирование памяти и т.п. И что они хранятся в куче, а если допустим объявить MyClass mc; то он будет в стеке. Что такое куча понимаю а вот стек нет... Далее, допустим надо завести ОЧЕНЬ много MyClass'ов, если будем заводить их MyClass *mc = new MyClass, то их количество ограничено как я понимаю размером ОЗУ, а если MyClass mc; то чем ограничено? и еще пример кода на QT:
0
|
12 / 12 / 2
Регистрация: 08.07.2009
Сообщений: 45
|
|
04.08.2009, 22:50 | 6 |
0
|
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
|
|
04.08.2009, 22:56 | 7 |
Что такое стек в теории я знаю, по этому и задал 3 вопроса, по сути об одном и томже, где этот стек распологается в памяти физически? Везде написано что "в адресном пространстве программы", я так понимаю адресное пространство это диапазон адресов который занимает ехешник(в самом простом случае), и что, обявленные как MyClass mc; переменный увеличивают размер ехешника(что бы было куда их поместить)?
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
04.08.2009, 23:33 | 8 |
По-твоему получается что КУЧА тоже находится в exe-нике ? Тут картинка есть, где находится стек. http://ru.wikipedia.org/wiki/Стек_вызовов
0
|
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
|
|
04.08.2009, 23:38 | 9 |
Про кучу то я знаю что она в незанятой памяти. ну хорошо, а размер этого стека и скорость доступа к нему по сравнению с кучей как? И по поводу кода что я привел никто не отписывается, а мне бы сильно помогло... Просто не пойму когда надо использовать указатели а когда нет.
Ну и на том спасибо, хоть знать буду где стек...
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
04.08.2009, 23:48 | 10 |
Скорость доступа - обычная, то есть это просто участок памяти. Я в QT не силен. Но если первый вариант кода работает, то я бы остановился на нем. Потому что выделение объекта в стеке происходит намного быстрее чем в куче. Добавлено через 45 секунд Хотя возможно, что ты глубоко заблуждаешься и объект как раз нужно выделять именно в куче.
0
|
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
|
|
04.08.2009, 23:55 | 11 |
QDir - класс работы с каталогом, важно что он КЛАСС, а во всех книгах классы заводятся через указатели, это и вводит в заблуждение. Оба варианта кода работают. Я не могу понять а если запихать в стек этот класс, то после выхода из процедуры он сотрется из памяти? И еще одно, каждая процедура/функция работает со своим стеком(участком памяти) или с общим? то есть я веду к тому, что можно ли нечаянно этот стек забить до отказа?
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
05.08.2009, 00:20 | 12 |
Программа будет аварийно завершена ОС. Точнее есть два варианта - либо ОС умеет расширять стек на ходу ( до какого-то предела ). Либо при превышении стека программа сразу будет завершена c ошибкой.
1
|
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
|
|
05.08.2009, 00:25 | 13 |
Оставил спасибо. Скоро буду разбираться с ссылками
0
|
05.08.2009, 00:25 | 14 | |||||
не читал ветку, но забить стек можно без проблем. безмерной рекурсией например.
попробуйте такое:
память в стэке, безусловно, выделяется быстрее, т.к. ее выделения фактически не происходит: сдвигается просто указатель стека на нужную величину, и объявляемые объекты отображаются на эту память (естественно, конструкторы вызываются для создаваемых объектов, но они вызываются и при intanantiation объектов в heap). выделение же памяти в heap - это обращение к опереционной системе! кроме того, ее потом нужно освободить, а это снова - обращение к операционной системе. стек же освобождается автоматически при выходе из контекста. такие переменные иногда называются "автоматическими".
0
|
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
|
|
05.08.2009, 00:28 | 15 |
Ну таким методом и кучу забить можно я имел ввиду в нормальных условиях при работе с большим объемом данных)
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
05.08.2009, 00:35 | 16 |
Большей частью достаточно библиотеки с функциями malloc(), free().
0
|
05.08.2009, 00:41 | 17 |
нужно обязательно оценить размер этих данных и сравнить со значением размера стэка по умолчанию. если нет - увеличить. если и увеличивать некуда - обрабатывать данные кусками с хранением на внешнем носителе.
я вам этот примерчик не для наследования привел, а чтобы вы могли за несколько минут удовлетворить наглядно ваше любопытство.
0
|
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
|
|
05.08.2009, 00:46 | 18 |
Следует вопрос как его увеличить, ради любопытства, вдруг придется столкнутся с таким.
0
|
05.08.2009, 00:47 | 19 |
я выразился неточно. конечно, запрос на 4 байта может быть удовлетворен из уже имеющихся выделенных системой блоков, но это все равно выполнение некоторого алгоритма, и, возможно, увеличение фрагментации памяти. стэк же всегда сплошной и всегда "под рукой".
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
05.08.2009, 00:53 | 20 |
Угу.
Только система не блоки выделяет, а куски непрерывной памяти для адресного пространства процесса. Блоки там уже функции malloc(), free() нарезают. Хотя если рассматривать именно физическую память - то конечно будут блоки. Но процесс вообще не сильно интересует как там ему достается виртуальная память. Главное чтобы ее по-больше было ! Добавлено через 58 секунд Может в опциях линкера где. Скорее стоит вопрос - как его уменьшить если что
0
|
05.08.2009, 00:53 | |
05.08.2009, 00:53 | |
Помогаю со студенческими работами здесь
20
Использование указателей использование указателей Использование указателей на функции Использование ссылок и указателей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |