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

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

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

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

02.08.2009, 20:39. Просмотров 1657. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2009, 20:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование указателей (C++):

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

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

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

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

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

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

22
Delphin_KKC
UNIX-way
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
02.08.2009, 20:43 #2
Ага.
Но можешь сам проверить.
Вывод строк 8 и 12, а также строк 9 и 11 должен быть одинаковым.
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 21:25 #3
2Nessaj: Если уж начал разбираться с указателями - давай еще ссылки освой.
Добавь сюда еще rAge - ссылку на myAge.

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

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

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

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

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

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

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

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

Добавлено через 45 секунд
Хотя возможно, что ты глубоко заблуждаешься и объект как раз нужно выделять именно в куче.
0
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
04.08.2009, 23:55 #11
QDir - класс работы с каталогом, важно что он КЛАСС, а во всех книгах классы заводятся через указатели, это и вводит в заблуждение. Оба варианта кода работают. Я не могу понять а если запихать в стек этот класс, то после выхода из процедуры он сотрется из памяти? И еще одно, каждая процедура/функция работает со своим стеком(участком памяти) или с общим? то есть я веду к тому, что можно ли нечаянно этот стек забить до отказа?
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
05.08.2009, 00:20 #12
Я не могу понять а если запихать в стек этот класс, то после выхода из процедуры он сотрется из памяти?
Сотрется. Только сначала деструктор вызовется.
или с общим?
Стек общий.
можно ли нечаянно этот стек забить до отказа?
Можно.
Программа будет аварийно завершена ОС.
Точнее есть два варианта - либо ОС умеет расширять стек на ходу ( до какого-то предела ).
Либо при превышении стека программа сразу будет завершена c ошибкой.
1
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:25 #13
Оставил спасибо. Скоро буду разбираться с ссылками
0
novi4ok
551 / 504 / 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 - это обращение к опереционной системе! кроме того, ее потом нужно освободить, а это снова - обращение к операционной системе. стек же освобождается автоматически при выходе из контекста. такие переменные иногда называются "автоматическими".
0
DarKNesS
0 / 0 / 0
Регистрация: 28.08.2007
Сообщений: 11
05.08.2009, 00:28 #15
Ну таким методом и кучу забить можно я имел ввиду в нормальных условиях при работе с большим объемом данных)
0
05.08.2009, 00:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2009, 00:28
Привет! Вот еще темы с ответами:

Использование указателей на функции - C++
Составить одну из двух задач с использованием указателя на функцию 1. Составить функцию нахождения корня уравнения f(x)=0 методом...

Код с использование указателей - C++
Переделайте пожалуйста код, что бы в нем использовались указатели В массиве хранится информация о численности книг в каждом из 35...

Использование указателей и функций - C++
Сформировать динамический массив Х размера M × N из случайных целых чисел. В программе организовать функцию для подсчета среднего...

Использование указателей в программах - C++
Тема: «Использование указателей в программах» №5.2 Составить программу, которая вычисляет наибольшие элементы и их порядковые номера...


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

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

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