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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Nessaj
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 18
#1

Использование указателей - C++

02.08.2009, 20:39. Просмотров 1601. Ответов 22
Метки нет (Все метки)

Всем привет, вот изучаю помалу С++. И уже третий час немогу впарится в Указатели недаётся мне это, вот вроде более менее разобрался, скажите правильно нет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 int main()
 {
     int xxx;
     unsigned short int myAge = 5;
     unsigned short int * pAge = NULL;  // a pointer
     pAge=&myAge;
     std::cout << "pAge " << pAge<<"\n"; //Хранится адрес myAge
     std::cout << "*pAge " << *pAge<<"\n"; //Указывает на переменную в myAge
     std::cout << "&pAge " << &pAge<<"\n"; //Показывает свой адрес
     std::cout << "myAge " << myAge<<"\n"; //Показывает свою переменную
     std::cout << "&myAge " << &myAge<<"\n"; //Показывает свой адрес
     std::cin >>xxx;
     return 0;
 
 }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Delphin_KKC
UNIX-way
709 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
02.08.2009, 20:43     Использование указателей #2
Ага.
Но можешь сам проверить.
Вывод строк 8 и 12, а также строк 9 и 11 должен быть одинаковым.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 21:25     Использование указателей #3
2Nessaj: Если уж начал разбираться с указателями - давай еще ссылки освой.
Добавь сюда еще rAge - ссылку на myAge.

Добавлено через 40 секунд
А еще указатели на массивы тоже освой. Массив of char и массив of int.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.08.2009, 05:17     Использование указателей #4
C++
1
std::cout << "*pAge " << *pAge<<"\n"; //Указывает на переменную в myAge
* - это операция
операция * применяется к переменной pAge типа указатель на ячейку памяти размера unsigned short int
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
04.08.2009, 22:26     Использование указателей #5
Еще объясните мне по указателям...
Почитал, посмотрел, понял что указатели хорошо использовать при передачи параметров функции например, что бы не тратить время на копирование памяти и т.п. И что они хранятся в куче, а если допустим объявить MyClass mc; то он будет в стеке. Что такое куча понимаю а вот стек нет...
Далее, допустим надо завести ОЧЕНЬ много MyClass'ов, если будем заводить их MyClass *mc = new MyClass, то их количество ограничено как я понимаю размером ОЗУ, а если MyClass mc; то чем ограничено?
и еще пример кода на QT:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Core::loadPlugins(QString path)
{
    QDir dir(path);
    if (!dir.cd("plugins"))
    {
        return;
    }
    foreach(Qsting strFileName, dir.entryList(QDir::Files))
    {
        QPluginLoader pl(dir.absoluteFilePath(strFileName));
        QObject *obj = pl.instance();
        add(obj);
    }
}
как правильнее будет? Как выше или как ниже?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Core::loadPlugins(QString path)
{
    QDir *dir= new QDir(path);
    if (!dir->cd("plugins"))
    {
        return;
    }
    foreach(QString strFileName, dir->entryList(QDir::Files))
    {
        QPluginLoader *pl= new QPluginLoader(dir->absoluteFilePath(strFileName));
        QObject *obj = pl->instance();
        add(obj);
 
    }
}
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
04.08.2009, 22:50     Использование указателей #6
Стек это - http://ru.wikipedia.org/wiki/Стек_(компьютер)
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
04.08.2009, 22:56     Использование указателей #7
Что такое стек в теории я знаю, по этому и задал 3 вопроса, по сути об одном и томже, где этот стек распологается в памяти физически? Везде написано что "в адресном пространстве программы", я так понимаю адресное пространство это диапазон адресов который занимает ехешник(в самом простом случае), и что, обявленные как MyClass mc; переменный увеличивают размер ехешника(что бы было куда их поместить)?
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
04.08.2009, 23:33     Использование указателей #8
где этот стек распологается в памяти физически?
Выделяется кусок памяти.
я так понимаю адресное пространство это диапазон адресов который занимает ехешник
Нет - не верно.
обявленные как MyClass mc; переменный увеличивают размер ехешника
Не увеличивают.

По-твоему получается что КУЧА тоже находится в exe-нике ?

Тут картинка есть, где находится стек.
http://ru.wikipedia.org/wiki/Стек_вызовов
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
04.08.2009, 23:38     Использование указателей #9
Цитата Сообщение от odip Посмотреть сообщение
Выделяется кусок памяти.

Нет - не верно.

Не увеличивают.

По-твоему получается что КУЧА тоже находится в exe-нике ?
Про кучу то я знаю что она в незанятой памяти. ну хорошо, а размер этого стека и скорость доступа к нему по сравнению с кучей как? И по поводу кода что я привел никто не отписывается, а мне бы сильно помогло... Просто не пойму когда надо использовать указатели а когда нет.

Ну и на том спасибо, хоть знать буду где стек...
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
04.08.2009, 23:48     Использование указателей #10
а размер этого стека и скорость доступа к нему по сравнению с кучей как?
Можно считать что размер стека определяется операционной системой.
Скорость доступа - обычная, то есть это просто участок памяти.

Я в QT не силен.
Но если первый вариант кода работает, то я бы остановился на нем. Потому что выделение объекта в стеке происходит намного быстрее чем в куче.

Добавлено через 45 секунд
Хотя возможно, что ты глубоко заблуждаешься и объект как раз нужно выделять именно в куче.
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
04.08.2009, 23:55     Использование указателей #11
QDir - класс работы с каталогом, важно что он КЛАСС, а во всех книгах классы заводятся через указатели, это и вводит в заблуждение. Оба варианта кода работают. Я не могу понять а если запихать в стек этот класс, то после выхода из процедуры он сотрется из памяти? И еще одно, каждая процедура/функция работает со своим стеком(участком памяти) или с общим? то есть я веду к тому, что можно ли нечаянно этот стек забить до отказа?
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
05.08.2009, 00:20     Использование указателей #12
Я не могу понять а если запихать в стек этот класс, то после выхода из процедуры он сотрется из памяти?
Сотрется. Только сначала деструктор вызовется.
или с общим?
Стек общий.
можно ли нечаянно этот стек забить до отказа?
Можно.
Программа будет аварийно завершена ОС.
Точнее есть два варианта - либо ОС умеет расширять стек на ходу ( до какого-то предела ).
Либо при превышении стека программа сразу будет завершена c ошибкой.
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:25     Использование указателей #13
Оставил спасибо. Скоро буду разбираться с ссылками
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2009, 00:25     Использование указателей #14
Цитата Сообщение от DarKNesS Посмотреть сообщение
...можно ли нечаянно этот стек забить до отказа?
не читал ветку, но забить стек можно без проблем. безмерной рекурсией например.

попробуйте такое:

C++
1
2
3
4
5
void func (long level){
   long a [10000];
   cout << level << eol;
   func (level+1);
}
и вызовите эту ф-ю. сколько-то уровней насчитаете, а потом произойдет переполнение стэка.
память в стэке, безусловно, выделяется быстрее, т.к. ее выделения фактически не происходит: сдвигается просто указатель стека на нужную величину, и объявляемые объекты отображаются на эту память (естественно, конструкторы вызываются для создаваемых объектов, но они вызываются и при intanantiation объектов в heap). выделение же памяти в heap - это обращение к опереционной системе! кроме того, ее потом нужно освободить, а это снова - обращение к операционной системе. стек же освобождается автоматически при выходе из контекста. такие переменные иногда называются "автоматическими".
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:28     Использование указателей #15
Ну таким методом и кучу забить можно я имел ввиду в нормальных условиях при работе с большим объемом данных)
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
05.08.2009, 00:35     Использование указателей #16
выделение же памяти в heap - это обращение к опереционной системе!
Не каждое выделение памяти в куче ведет к вызову syscall-ов ОС.
Большей частью достаточно библиотеки с функциями malloc(), free().
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2009, 00:41     Использование указателей #17
Цитата Сообщение от DarKNesS Посмотреть сообщение
Ну таким методом и кучу забить можно я имел ввиду в нормальных условиях при работе с большим объемом данных)
нужно обязательно оценить размер этих данных и сравнить со значением размера стэка по умолчанию. если нет - увеличить. если и увеличивать некуда - обрабатывать данные кусками с хранением на внешнем носителе.
я вам этот примерчик не для наследования привел, а чтобы вы могли за несколько минут удовлетворить наглядно ваше любопытство.
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:46     Использование указателей #18
Следует вопрос как его увеличить, ради любопытства, вдруг придется столкнутся с таким.
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2009, 00:47     Использование указателей #19
Цитата Сообщение от odip Посмотреть сообщение
Не каждое выделение памяти в куче ведет к вызову syscall-ов ОС.
Большей частью достаточно библиотеки с функциями malloc(), free().
я выразился неточно. конечно, запрос на 4 байта может быть удовлетворен из уже имеющихся выделенных системой блоков, но это все равно выполнение некоторого алгоритма, и, возможно, увеличение фрагментации памяти. стэк же всегда сплошной и всегда "под рукой".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2009, 00:53     Использование указателей
Еще ссылки по теме:

Код с использование указателей C++
Использование ссылок и указателей C++
использование указателей C++
C++ Использование умных указателей
Использование указателей C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
05.08.2009, 00:53     Использование указателей #20
Угу.
Только система не блоки выделяет, а куски непрерывной памяти для адресного пространства процесса.
Блоки там уже функции malloc(), free() нарезают.
Хотя если рассматривать именно физическую память - то конечно будут блоки.
Но процесс вообще не сильно интересует как там ему достается виртуальная память.
Главное чтобы ее по-больше было !

Добавлено через 58 секунд
как его увеличить
А черт его знает.
Может в опциях линкера где.
Скорее стоит вопрос - как его уменьшить если что
Yandex
Объявления
05.08.2009, 00:53     Использование указателей
Ответ Создать тему
Опции темы

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