Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60

Указатели "на пальцах" и ошибка в VS2015

10.12.2016, 20:08. Показов 1106. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
дошел до темы указателей, прочитал кучу разных источников, теория понятна, но нет понимания с "физической" точки зрения - что это, в каком виде/размере и где хранится эта информация в памяти, очень прошу просто на пальцах объяснить процессы.
И, отдельно, какая последовательность действий, когда происходит разыменование?

p.s. утрировано, с переменными int - объявили, выделилось 4 байта, записали цифры в бинарном виде, обратились по адресу, вызвали. А как это с указателями?

И, возможно, в тему вопрос, VS ругается на delete указателя (ошибка памяти и кучу), но почему понять не могу. Что-то он пытается другое из памяти удалить, как мне чувствуется, собственно поэтому и пытаюсь понять, какие идут процессы.
p.s. Код:блокс прожевывает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void)
{
    setlocale(LC_ALL, "rus");
    
    int x = 20; //Переменная x = 20
    int *ptr = new int; //ptr есть указатель на int
 
    ptr = &x;
 
    cout << "ptr = " << ptr << endl;    //Указатель ptr= Адрес памяти
    cout << "*ptr = " << *ptr << endl;  //Разыменованный указатель ptr= Значение по адресу
    cout << "&x = " << &x << endl;      // Адрес ячейки памяти переменной x;
 
    delete ptr;
    
    system("pause");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2016, 20:08
Ответы с готовыми решениями:

Ошибка установки VS2015 на WIN10
Здравствуйте уважаемые форумчане. В общем - спасайте!:( Столкнулся с такой бедой: при установке VS 2015,в ходе инсталляции вылетает...

Ошибка при установке VS2015
При установке VS2015(как с образа, так и с сайта MS) возникает следующая ошибка: &quot;Программа устаноки Отказано в доступе&quot;(при установке...

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть контейнер: vector &lt;Shape*&gt; Scontainer;...

14
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.12.2016, 20:16
Цитата Сообщение от badvik Посмотреть сообщение
C++
1
2
int *ptr = new int; //ptr есть указатель на 
int ptr = &x;
Тут память утекла. Сначала ptr хранил адрес, который возвратил new, потом ты присвоил ему адрес переменной x. При delete будет попытка освобождения памяти, которая была выделена не через new.

Добавлено через 2 минуты
Нужно или так:
C++
1
2
3
4
    int x = 20; //Переменная x = 20
    int *ptr = new int; //ptr есть указатель на int
 
    *ptr = x;
Или так (без delete):
C++
1
2
3
4
    int x = 20; //Переменная x = 20
    int *ptr; //ptr есть указатель на int
 
    ptr = &x;
0
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
10.12.2016, 20:39  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Тут память утекла. Сначала ptr хранил адрес, который возвратил new, потом ты присвоил ему адрес переменной x. При delete будет попытка освобождения памяти, которая была выделена не через new.
Проблема именно в new или адреса указателя в принципе? Я закомментировал new, просто объявив *ptr, но ошибка та же осталась.

p.s. поправлю - в комментировании моего кода у тебя int из комментов перенесся в объявление.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.12.2016, 22:27
Цитата Сообщение от badvik Посмотреть сообщение
Я закомментировал new, просто объявив *ptr, но ошибка та же осталась.
Как сделал - один ты видишь. Код показывай.
0
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
10.12.2016, 22:42  [ТС]
Частично я нашел ответ на первую часть вопросов ниже по ссылке, поправьте, если не прав:
Кликните здесь для просмотра всего текста

т.е. в памяти (куче) выделяется отдельное место, где хранится адрес... а как он хранится - бинарное представление адреса ячейки - т.е. прямо вот 0x1234 5678?
И разыменование - получается это команда заглянуть по указателю, провалиться дальше до адреса и прочитать значение?
И если это верно, то непонятно только одно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int x = 20; //Переменная x = 20
    int *ptr = &x; //ptr есть указатель на int
    int **ptrToPtr = &ptr;
    int ***ptrToPtrToPtr = &ptrToPtr;
 
    cout << "&x = " << &x << endl;                              // Адрес ячейки памяти переменной x;
    cout << "ptr = " << ptr << endl;                            // Адрес ptr
    cout << "ptrToPtr = " << &ptrToPtr << endl;                 // Адрес ptrToPtr
    cout << "ptrToPtrToPtr = " << &ptrToPtrToPtr << endl;       // Адрес ptrToPtrToPtr
        
    system("pause");
    return 0;
почему указатели на указатели дают разные адреса, а указатель первого уровня имеет одинаковый адрес с объектом?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.12.2016, 22:46
Цитата Сообщение от badvik Посмотреть сообщение
C++
1
cout << "ptr = " << ptr << endl; // Адрес ptr
Это не адрес ptr (адрес так берут: &ptr), а значение ptr, то есть, адрес, который в нём содержится.
1
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
10.12.2016, 22:47  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Как сделал - один ты видишь. Код показывай.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int x = 20;     //Переменная x = 20
    int *ptr;       //= new int; //ptr есть указатель на int
 
    ptr = &x;
 
    cout << "ptr = " << ptr << endl;    //Указатель ptr= Адрес памяти
    cout << "*ptr = " << *ptr << endl;  //Разыменованный указатель ptr= Значение по адресу
    cout << "&x = " << &x << endl;      // Адрес ячейки памяти переменной x;
 
    delete ptr;
        
    system("pause");
    return 0;
И если брать этот вариант, как тогда удалять указатель?
C++
1
2
3
4
    int x = 20; //Переменная x = 20
    int *ptr; //ptr есть указатель на int
 
    ptr = &x;
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.12.2016, 22:50
Цитата Сообщение от badvik Посмотреть сообщение
delete ptr;
...
Цитата Сообщение от nd2 Посмотреть сообщение
При delete будет попытка освобождения памяти, которая была выделена не через new.
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
10.12.2016, 22:51
Цитата Сообщение от badvik Посмотреть сообщение
почему указатели на указатели дают разные адреса
Потому что они разные, это разные ячейки памяти. Конкретнее вопрос.

Цитата Сообщение от badvik Посмотреть сообщение
указатель первого уровня имеет одинаковый адрес с объектом?
Потому что Вы же сами присвоили указателю первого уровня адрес переменной х.
Цитата Сообщение от badvik Посмотреть сообщение
int *ptr = &x;
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.12.2016, 22:51
Цитата Сообщение от badvik Посмотреть сообщение
И если брать этот вариант, как тогда удалять указатель?
А зачем его удалять? У тебя, подобный вопрос, насчёт x не возникает?
0
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
10.12.2016, 23:23  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Это не адрес ptr (адрес так берут: &ptr), а значение ptr, то есть, адрес, который в нём содержится.
Теперь ясно, спасибо. Эти "адреса" у меня и смешались.

Добавлено через 27 минут
Цитата Сообщение от nd2 Посмотреть сообщение
А зачем его удалять? У тебя, подобный вопрос, насчёт x не возникает?
На данном этапе, конечно, нет, код смешной. Я думал, это в принципе нужно знать, поэтому и спрашивал.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.12.2016, 23:31
Цитата Сообщение от badvik Посмотреть сообщение
На данном этапе, конечно, нет, код смешной.
Этап здесь не при чём, и код обычный. Ты понял, почему я спросил насчёт x?
Цитата Сообщение от badvik Посмотреть сообщение
Я думал, это в принципе нужно знать, поэтому и спрашивал.
Что нужно знать?
0
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
11.12.2016, 00:06  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Этап здесь не при чём, и код обычный. Ты понял, почему я спросил насчёт x?
Что нужно знать?
Насчет x сейчас у меня вопрос не возник, потому что это некий "фиксированный" объект на данный момент не требующий много памяти, в то время как указатель - "динамический" и может потребовать больших ресурсов и поэтому от него, по мере прохода кода надо избавляться. С динамическими массивами, например. Я понял из такого контекста, не прав?

p.s. в учебниках пока до этого не дошел, больше вклад внесла вот эта статья, примеры и задачи оттуда:
Кликните здесь для просмотра всего текста
http://purecodecpp.com/archives/1188
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.12.2016, 02:05
Цитата Сообщение от badvik Посмотреть сообщение
Насчет x сейчас у меня вопрос не возник, потому что это некий "фиксированный" объект на данный момент не требующий много памяти, в то время как указатель - "динамический" и может потребовать больших ресурсов и поэтому от него, по мере прохода кода надо избавляться.
В том то и дело, что никакой он не "динамический", а такой же, как x, только x хранит число, а указатель - адрес. Следовательно, никакого удаления, для этого указателя, не требуется, так же, как и для х. Ты путаешь переменную указатель (такая же, как и другие переменные), и адрес памяти, который в ней содержится. Если указатель содержит адрес пмяти, выделенной через new, то эту память нужно освобождать через delete (используя значение указателя - адрес памяти, который он хранит), но это не относится к самому указателю, созданному, в данном случае, в области автоматической памяти (так же, как и x).

Добавлено через 16 минут
Пример создания самого указателя в динамической памяти:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    int x = 20; 
    int** pptr = new int*; // в динамической памяти создаётся указатель на int,
                           // адрес, созданного указателя, помещается в pptr (сам pptr создаётся в автоматической памяти)
    
    *pptr = new int(x);    // в динамической памяти создаётся объект типа int, 
                           // который инициализируется значением переменной x, 
                           // адрес этого объекта помещается в указатель, созданный в динмической памяти
 
    cout << **pptr << endl; 
 
    delete *pptr; // освобождаем память под объектом типа int, созданного в динамической памяти
    delete pptr;  // освобождаем память под указателем на int, созданного в динамической памяти
1
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
11.12.2016, 14:54  [ТС]
nd2, более чем "на пальцах", спасибо и этим постом за доходчивое объяснение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.12.2016, 14:54
Помогаю со студенческими работами здесь

Добрый вечер! При отладки следующая ошибка (вложение). Как исправить? VS2015
#define _CRT_SECURE_NO_WARNINGS #include &lt;locale.h&gt; #include &lt;stdio.h&gt; #include &lt;complex&gt; #include &lt;iostream&gt; #include &lt;clocale&gt; ...

Ошибка в VS2015: "Не удается найти автоматически сохраняемый файл параметров"
Что это за ошибка и как ее можно исправить ? P.S. после чего VS2015 не закрывается и не запускается. &quot;Стоит&quot; на месте, ничего...

Ошибка ssis пакета (vs2008) при загрузке .csv файла в БД при запуске VS2015
SSIS пакет создан в vs2008. Работал. Сменился MS Server на 2015 и vs2015. Загружаю. Выдает ошибку ] Ошибка: Ошибка при обработке...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

DI на пальцах
Всем здрасьте, кто может обьяснить что дает как работает dependency injection на пальцах сколько читаю всё равно картинки явной нету, на...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru