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

Не могу разобраться с указателями! - C++

Восстановить пароль Регистрация
 
Kosmonaftus
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 32
23.11.2013, 15:00     Не могу разобраться с указателями! #1
Читаю Шилдт C++, не как не могу понять систему с указателями, вроде вот вот все понял что это просто типа ярлыков для переменных и не более того и занимают они по 1 байту в памяти, как в друг он пишет:

С указателями можно использовать только четыре арифметических оператора: ++, --, + и -. Чтобы лучше понять, что происходит при выполнении арифметических действий с указателями, начнем с примера. Пусть p1 — указатель на int-переменную с текущим значением 2 ООО (т.е. p1 содержит адрес 2 ООО). После выполнения (в 32-разрядной среде) выражения
p1++;
содержимое переменной-указателя p1 станет равным 2 004, а не 2 001!
Ну я как дотощный иду пробывать, примеров он не привел:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main(){
    int *p1,p2;
    p2 = 2000;
    p1 = &p2;
 
    cout << p1 << "\n";
    
    p1++;
 
    cout << p1 << "\n";
    return 0;
}
И я вижу
0012FF78
0012FF7C
Что это за такое? И почему не получилось 2004 как он пишет? Ну отдаленно понятно что это адреса так обозначаются области памяти и что при ++ это какая то следующая область в памяти а не число. Но причем тут 2004? Объясните пожалуйста. Только на доступном языке.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
reidaigo
6 / 6 / 0
Регистрация: 16.12.2012
Сообщений: 31
23.11.2013, 15:07     Не могу разобраться с указателями! #2
Kosmonaftus, содержимое указателя(то есть переменная, на которую указывает указатель) и сам указатель - разные вещи. Содержимое указателя, например, имеет некое числовое значение, когда указатель имеет значение адреса ячейки памяти.
Используйте операцию разыименования. Попробуйте так:
C++
1
2
3
4
5
    cout << *p1 << "\n";
    
    *p1=*p1+1;
 
    cout << *p1 << "\n";
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
23.11.2013, 15:07     Не могу разобраться с указателями! #3
Указатель надо разыменовывать
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(){
    int *p1,p2;
    p2 = 2000;
    p1 = &p2;
 
    cout << (*p1) << "\n";
    
    (*p1)++;
 
    cout << (*p1) << "\n";
    return 0;
}
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.11.2013, 15:08     Не могу разобраться с указателями! #4
Цитата Сообщение от Kosmonaftus Посмотреть сообщение
0012FF78
0012FF7C
Что это за такое?
Это адрес, который хранит переменная-указатель. Указатель это не ярлык. Это переменная, хранящая адрес чего-либо. Значение указателя - адрес. Ты его и вывел.
Цитата Сообщение от Kosmonaftus Посмотреть сообщение
не получилось 2004 как он пишет?
Потому что ++ относится к указателю. То есть, увеличивает адрес на определенное значение в зависисмости от типа данных.
Цитата Сообщение от Kosmonaftus Посмотреть сообщение
Но причем тут 2004?
При том, что используетс я тип int. В общем случае его размер равен 4 байтам. Поэтому инкремент уВеличит значение указателя не на 1, а на 4. Чтобы он указывал, вдруг, не в середину твоего int'а.
2000 Шилдт пример в качестве примера адреса. Если адрес был 2000 в указателе, то станет 2004. Посчитай разницу у себя в адресах. Получишь, тоже 4
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.11.2013, 15:09     Не могу разобраться с указателями! #5
Удалил.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.11.2013, 15:14     Не могу разобраться с указателями! #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Размер адреса (а значит и указателя) в 32-х битной системе 4 байта. Поэтому: было 2000, стало - 2004.
Нет, не поэтому.
alsav22
23.11.2013, 15:15
  #7

Не по теме:

Цитата Сообщение от Vourhey Посмотреть сообщение
Нет, не поэтому.
Уже удалил, не то написал.

Vourhey
23.11.2013, 15:16
  #8

Не по теме:

alsav22, фигня, бывает

Kosmonaftus
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 32
23.11.2013, 15:27  [ТС]     Не могу разобраться с указателями! #9
Цитата Сообщение от Vourhey Посмотреть сообщение
Это адрес, который хранит переменная-указатель. Указатель это не ярлык. Это переменная, хранящая адрес чего-либо. Значение указателя - адрес. Ты его и вывел.
ну я так понял, что указатель *p допустим это просто путь до памяти которую занимает указанный объект или переменная. А эти цифры просто номера ячеек? При каждом ++ идет сдвиг +4 байта те на следующий блок памяти.

И еще вопрос, а зачем такие сложности с указателями ...?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2013, 15:42     Не могу разобраться с указателями!
Еще ссылки по теме:

C++ Не могу разобраться с указателями(не понимаю сути освобождения памяти)
Как создать 2-ое дерево со значениями 1-го? Не могу разобраться с указателями C++
Разобраться с указателями и ссылками. Совсем запутался C++

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

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.11.2013, 15:42     Не могу разобраться с указателями! #10
Цитата Сообщение от Kosmonaftus Посмотреть сообщение
А эти цифры просто номера ячеек?
Можно воспринимать и так.
Цитата Сообщение от Kosmonaftus Посмотреть сообщение
При каждом ++ идет сдвиг +4 байта те на следующий блок памяти.
Нет. То, на сколько изменится значение указателя зависит от его типа, который был указан в объявлении. Если явно привести тип к другому и сделать ++, то изменится на другое значение. Сделай свой пример с bool, а не с int, увидишь, что изменился на 1, а не на 4.
Цитата Сообщение от Kosmonaftus Посмотреть сообщение
И еще вопрос, а зачем такие сложности с указателями ...?
Сложностей никаких нет. Ты просто не привык. А с памятью работать нужно, язык-то не самого верхнего уровня. А вообще, это вопрос риторический.
Понимание для чего вообще нужны указатели?
Yandex
Объявления
23.11.2013, 15:42     Не могу разобраться с указателями!
Ответ Создать тему
Опции темы

Текущее время: 22:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru