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

Зачем использовать Указатель на указатель? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Считать BMP изображение в динамическую память http://www.cyberforum.ru/cpp-beginners/thread1244274.html
Нужно считать ВМР изображение в массив в динамической памяти используя fstream.
C++ Что такое шаблоны функций? Люди обясните пожалуйста шаблоны функций На заннятиях чучуть провтыкал помогите вы буду благодарен!! http://www.cyberforum.ru/cpp-beginners/thread1244255.html
C++ Объяснить линейный поиск в массиве и сортировка массива
Рябята кому не трудно кто может обяснить линейный поиск в масиве и сортировку масива Не очень понял как на парах обясняли обясните вы пожалуйста буду благодарен!
Вычислите значения полиномов Лагерра Ln(x): C++
Ln(x)=\begin{cases}1 & \text{ if } n=0 \\ -x + 1 & \text{ if } n=1 \\ x^2-4x+2 & \text{ if } n=2 \\ -x^3+9x^2-18x+6 & \text{ if } n=3 \\ x^4-16x^3+72x^2-96x+24 & \text{ if } n=4 \end{cases} x = 0.5. Помогите пожалуйста!!
C++ Cохранение очень большого массива в текстовый файл http://www.cyberforum.ru/cpp-beginners/thread1244221.html
Помогите пожалуйста. Мне требуется сохранить карту в своей игре в текстовый файл. Класс карты: class cMap { public: cRegion regions; }; class cRegion { public:
C++ Написать функцию, которая сортирует переданный ей динамический массив "быстрой" сортировкой #include <iostream> #include <vector> using namespace std; void qSort( vector <int> &A,int nStart, int nEnd) { int L,R,c,X; if (nStart>=nEnd) return; L=nStart; R=nEnd; X=A; while (L<=R) подробнее

Показать сообщение отдельно
_Front_
Сообщений: n/a
19.08.2014, 08:08     Зачем использовать Указатель на указатель?
Недавно столкнулся сам с подобной проблемой, вроде допёр, что как, сейчас попробую объяснить. Есть типы данных, простые (навроде int, char, double) или созданные пользователем(ну там, какие придумаешь Rocket, Car, Child), любому типу данных нужна память, в которой он будет располагаться (ну, например, его поля - данные). Эта память выделяется при создании объекта. Можно получить адрес расположения объекта и сохранить его в указателе. Типа
C++
1
2
int size = 5;
int *pointerToSize = &size;
Таким образом указатель с одной стороны - хранит просто какой-то адрес (ну например 0x..1ef) с другой стороны - содержит информацию о том, на что именно указывает - в приведённом примере - на int. Это нужно для того, что-бы при выполнении адресной арифметики можно было не задумываясь каждый раз о размере объекта смещаться ровно на величину объекта. Т.е. если int занимает в памяти 4 байта. То pointerToSize += 1; Заставит изменить значение адреса, хранящегося по указателю на 4 байта, хоть мы в данном случае и попадём в область памяти, которая нам не принадлежит. За счет этого механизма достаточно удобно обходить массивы элементов - нужно просто иметь указатель на начало массива и прибавлять к нему столько единиц, на сколько нужно переместиться. Теперь про указатели на указатели. Указатель на некоторый объект - сам по себе является объектом и тоже хранится в памяти. Т.е. например pointerToSize хранит в себе некоторый адрес, но этот адрес ведь тоже надо где-то хранить. Где? Да всё там-же в общей памяти. Ровно на строчке int *pointerToSize = &size; она была выделена. Таким образом мы можем взять и захотеть сохранить адрес, по которому лежит сам pointerToSize:
C++
1
int **pointerToPointer = &pointerToSize;
Вот и всё - получается цепочка - где-то в памяти есть адрес, по которому лежит pointerToPointer, сам pointerToPointer хранит в себе другой адрес в памяти, по которому лежит pointerToSize, а уж pointerToSize хранит в себе адрес на конкретное число. Получается вот что - если одномерный массив легко обходить по одинарному указателю - как я писал выше, то двумерный - по двойному. Представим что строка - это одномерный массив, если 3 строки написать одна под другой - получится 2-мерный массив. Двойной указатель будет содержать в себе адрес на левый верхний угол массива, а если к этому указателю прибавить скажем 1 - он станет указывать на 1ую строчку. Т.е. он будет смещаться на размер одномерного указателя - и попадёт на адрес одномерного указателя, который в свою очередь будет указывать на первую строчку в массиве. (это всё чисто для понимания, в памяти всё будет представлено последовательно).
 
Текущее время: 13:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru