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

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

Войти
Регистрация
Восстановить пароль
 
Kosmonaftus
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 32
#1

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

23.11.2013, 15:00. Просмотров 363. Ответов 9
Метки нет (Все метки)

Читаю Шилдт 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? Объясните пожалуйста. Только на доступном языке.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2013, 15:00     Не могу разобраться с указателями!
Посмотрите здесь:

Не могу разобраться с указателями - C++
Здраствуйте все вот короче мне задали задачки на Си написать вот они собствено : 1.Даны два массива, упорядоченных по возрастанию: А и B....

Не могу разобраться с указателями - C++
Здравствуйте, никак не могу разобраться с этими указателями, вот есть одна функция: //Вводимо матрицю int **Matrix(int n) {int...

Как создать 2-ое дерево со значениями 1-го? Не могу разобраться с указателями - C++
Вот код(недоработанный): #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; struct sNode { int...

Не могу разобраться с указателями(не понимаю сути освобождения памяти) - C++
Вот я тоже дуб в указателях... помогите пожалуйста кому не лениво... с горем пополам заработал Enter (ноуту пора в утиль), и вот (вопросы...

Нужно разобраться с указателями - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; //подсчет кол-ва согласных в слове int cntsogl(char *s) { int n=0;...

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

Разобраться с указателями и ссылками. Совсем запутался - C++
Привет! Расскажите или скажите где подробно и понятно описан механизм работы с указателями и ссылками. то что * - указатель, а &amp; -...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 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
Почетный модератор
6477 / 2252 / 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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.11.2013, 15:09     Не могу разобраться с указателями! #5
Удалил.
Vourhey
Почетный модератор
6477 / 2252 / 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++
Значит так! Есть 4 указателя - 2 из них описанны в классе, 2 глобально. В классе есть конструктор, который выделяет место под...

Не могу что-то понять с указателями - C++
Объясните мне,пожалуйста, почему когда я пишу так: void main() { char arr=&quot;erbb45&quot;; char *parr = &amp;arr; cout &lt;&lt; hex; ...

не могу сделать программу с указателями на массив и с функцией - C++
такая &quot;беда&quot; впервые столкнулся с указателями,в них чайник.. вот код задание--вывести массив,сделать так,чтоб к этому массиву...

Не могу понять, что означает данная операция с указателями - C++
вот такой код #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int rrr2 (int **p) {return ((**p-1)***p);}; ...

Не могу разобраться с интерфейсом - C++
Здравствуйте, у меня такой вопрос. Я как то видел в одном из видео уроков по С++ что в его Visual С++ используется(не знаю как правильно...


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

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6477 / 2252 / 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     Не могу разобраться с указателями!
Ответ Создать тему
Опции темы

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