Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/12: Рейтинг темы: голосов - 12, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 18
1

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

02.08.2009, 20:39. Просмотров 2127. Ответов 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;
 
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2009, 20:39
Ответы с готовыми решениями:

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между...

использование указателей
не знал как тему даже назвать :-class CTest { public: int x; void xpp() { x++; } };

Использование указателей
Не могли бы вы показать как решить это через указатели. Решение правильное. #include &lt;iostream&gt;...

использование указателей
Подскажите, пожалуйста, в чем здесь ошибка? #include &lt;iostream&gt; using namespace std; int x =...

22
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,721
02.08.2009, 20:43 2
Ага.
Но можешь сам проверить.
Вывод строк 8 и 12, а также строк 9 и 11 должен быть одинаковым.
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
02.08.2009, 21:25 3
2Nessaj: Если уж начал разбираться с указателями - давай еще ссылки освой.
Добавь сюда еще rAge - ссылку на myAge.

Добавлено через 40 секунд
А еще указатели на массивы тоже освой. Массив of char и массив of int.
0
4846 / 3267 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
03.08.2009, 05:17 4
C++
1
std::cout << "*pAge " << *pAge<<"\n"; //Указывает на переменную в myAge
* - это операция
операция * применяется к переменной pAge типа указатель на ячейку памяти размера unsigned short 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:
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);
 
    }
}
0
12 / 12 / 2
Регистрация: 08.07.2009
Сообщений: 45
04.08.2009, 22:50 6
Стек это - http://ru.wikipedia.org/wiki/Стек_(компьютер)
0
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
04.08.2009, 22:56 7
Что такое стек в теории я знаю, по этому и задал 3 вопроса, по сути об одном и томже, где этот стек распологается в памяти физически? Везде написано что "в адресном пространстве программы", я так понимаю адресное пространство это диапазон адресов который занимает ехешник(в самом простом случае), и что, обявленные как MyClass mc; переменный увеличивают размер ехешника(что бы было куда их поместить)?
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
04.08.2009, 23:33 8
где этот стек распологается в памяти физически?
Выделяется кусок памяти.
я так понимаю адресное пространство это диапазон адресов который занимает ехешник
Нет - не верно.
обявленные как MyClass mc; переменный увеличивают размер ехешника
Не увеличивают.

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

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

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

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

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

Ну и на том спасибо, хоть знать буду где стек...
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
04.08.2009, 23:48 10
а размер этого стека и скорость доступа к нему по сравнению с кучей как?
Можно считать что размер стека определяется операционной системой.
Скорость доступа - обычная, то есть это просто участок памяти.

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

Добавлено через 45 секунд
Хотя возможно, что ты глубоко заблуждаешься и объект как раз нужно выделять именно в куче.
0
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
04.08.2009, 23:55 11
QDir - класс работы с каталогом, важно что он КЛАСС, а во всех книгах классы заводятся через указатели, это и вводит в заблуждение. Оба варианта кода работают. Я не могу понять а если запихать в стек этот класс, то после выхода из процедуры он сотрется из памяти? И еще одно, каждая процедура/функция работает со своим стеком(участком памяти) или с общим? то есть я веду к тому, что можно ли нечаянно этот стек забить до отказа?
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
05.08.2009, 00:20 12
Я не могу понять а если запихать в стек этот класс, то после выхода из процедуры он сотрется из памяти?
Сотрется. Только сначала деструктор вызовется.
или с общим?
Стек общий.
можно ли нечаянно этот стек забить до отказа?
Можно.
Программа будет аварийно завершена ОС.
Точнее есть два варианта - либо ОС умеет расширять стек на ходу ( до какого-то предела ).
Либо при превышении стека программа сразу будет завершена c ошибкой.
1
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:25 13
Оставил спасибо. Скоро буду разбираться с ссылками
0
554 / 508 / 25
Регистрация: 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 - это обращение к опереционной системе! кроме того, ее потом нужно освободить, а это снова - обращение к операционной системе. стек же освобождается автоматически при выходе из контекста. такие переменные иногда называются "автоматическими".
0
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:28 15
Ну таким методом и кучу забить можно я имел ввиду в нормальных условиях при работе с большим объемом данных)
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
05.08.2009, 00:35 16
выделение же памяти в heap - это обращение к опереционной системе!
Не каждое выделение памяти в куче ведет к вызову syscall-ов ОС.
Большей частью достаточно библиотеки с функциями malloc(), free().
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2009, 00:41 17
Цитата Сообщение от DarKNesS Посмотреть сообщение
Ну таким методом и кучу забить можно я имел ввиду в нормальных условиях при работе с большим объемом данных)
нужно обязательно оценить размер этих данных и сравнить со значением размера стэка по умолчанию. если нет - увеличить. если и увеличивать некуда - обрабатывать данные кусками с хранением на внешнем носителе.
я вам этот примерчик не для наследования привел, а чтобы вы могли за несколько минут удовлетворить наглядно ваше любопытство.
0
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:46 18
Следует вопрос как его увеличить, ради любопытства, вдруг придется столкнутся с таким.
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2009, 00:47 19
Цитата Сообщение от odip Посмотреть сообщение
Не каждое выделение памяти в куче ведет к вызову syscall-ов ОС.
Большей частью достаточно библиотеки с функциями malloc(), free().
я выразился неточно. конечно, запрос на 4 байта может быть удовлетворен из уже имеющихся выделенных системой блоков, но это все равно выполнение некоторого алгоритма, и, возможно, увеличение фрагментации памяти. стэк же всегда сплошной и всегда "под рукой".
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
05.08.2009, 00:53 20
Угу.
Только система не блоки выделяет, а куски непрерывной памяти для адресного пространства процесса.
Блоки там уже функции malloc(), free() нарезают.
Хотя если рассматривать именно физическую память - то конечно будут блоки.
Но процесс вообще не сильно интересует как там ему достается виртуальная память.
Главное чтобы ее по-больше было !

Добавлено через 58 секунд
как его увеличить
А черт его знает.
Может в опциях линкера где.
Скорее стоит вопрос - как его уменьшить если что
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2009, 00:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Использование указателей
Здравствуйте, немного не понимаю как правильно использовать указатели, например, я знаю, что при...

использование указателей
Должна быть разработана программа с меню с использованием указателей: 1. Изменить порядок...

Использование указателей на функции
Составить одну из двух задач с использованием указателя на функцию 1. Составить функцию...

Использование ссылок и указателей
Добрый вечер Помогите разобраться и понять «Использование ссылок и указателей» Прочел много...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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