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

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

Войти
Регистрация
Восстановить пароль
 
serega006
7 / 7 / 1
Регистрация: 16.10.2011
Сообщений: 347
#1

Объясните работу указателей - C++

20.11.2014, 23:50. Просмотров 260. Ответов 7
Метки нет (Все метки)

Не могу въехать в тему указателей в с++.Как я понял указатель это та же переменная только значением является адрес. Дали в универе код, сижу над ним, никак не могу вникнуть.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    int *q, n, *p; // здесь вроде как объявляем 2 указателя и переменную
    n = 100;
    p = &n; // &-используется для определения адреса по имени, т.е. приравниваем переменной p адрес?
    q = p; //p=&n => q=&n? т.е. q тоже получает в значение адрес?
    (*p)++; // почему эта операция происходит раньше p = &n и q = p?
    cout << *q << endl; // здесь мы получаем 101
    cout << n << endl; // тоже 101
    cout << p << endl; // тут адрес
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
3366 / 1688 / 448
Регистрация: 18.10.2014
Сообщений: 3,098
20.11.2014, 23:54     Объясните работу указателей #2
Цитата Сообщение от serega006 Посмотреть сообщение
C++
1
int *q, n, *p; // здесь вроде как объявляем 2 указателя и переменную
Да.

Цитата Сообщение от serega006 Посмотреть сообщение
C++
1
p = &n; // &-используется для определения адреса по имени, т.е. приравниваем переменной p адрес?
Присваиваем переменной 'p' адрес переменной 'n'.

Цитата Сообщение от serega006 Посмотреть сообщение
C++
1
q = p; //p=&n => q=&n? т.е. q тоже получает в значение адрес?
Да. Тот же адрес переменной 'n'.

Цитата Сообщение от serega006 Посмотреть сообщение
C++
1
(*p)++; // почему эта операция происходит раньше p = &n и q = p?
Что? С чего вы взяли, что "эта операция происходит раньше p = &n и q = p"???
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2014, 10:29     Объясните работу указателей #3
Цитата Сообщение от serega006 Посмотреть сообщение
&n; // &-используется для определения адреса по имени, т.е. приравниваем переменной p адрес?
&n - это взятие адреса переменной n, переменной p присваивается этот адрес, то есть выполняется операция, в результате которой значение переменной p становится равной адресу, взятому выражением &n.

Добавлено через 55 секунд
Цитата Сообщение от serega006 Посмотреть сообщение
(*p)++; // почему эта операция происходит раньше p = &n и q = p?
Не раньше, а позже.

Добавлено через 3 минуты
Цитата Сообщение от serega006 Посмотреть сообщение
cout << *q << endl; // здесь мы получаем 101 cout << n << endl; // тоже 101
Ну правильно. Ты же в
C++
1
(*p)++;
разыменовал указатель выражением *p, а потом оператором ++ увеличил значение переменной, которая лежит по этому адресу. А там лежит переменная n. Если бы
C++
1
(*p)++;
выполнилась до
C++
1
p=&n;
, то n бы была рана 100, а если вообще до какого либо присваивания адреса переменой p, то получим фатальный егог.
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
21.11.2014, 10:29     Объясните работу указателей #4
Цитата Сообщение от serega006 Посмотреть сообщение
(*p)++; // почему эта операция происходит раньше p = &n и q = p?
она не происходит раньше. *p - дает нам значение, лежащее по адресу, хранящемуся в p, а ++ увеличивает значение 100 на 1.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2014, 10:30     Объясните работу указателей #5
Цитата Сообщение от serega006 Посмотреть сообщение
cout << *q << endl; // здесь мы получаем 101
Адреса то равны, ты разыменуешь q, получая переменную по адресу q, выше ты увеличил до 101 переменную по адресу p, но p и q - это один и тот же адрес.
serega006
7 / 7 / 1
Регистрация: 16.10.2011
Сообщений: 347
21.11.2014, 14:51  [ТС]     Объясните работу указателей #6
Благодарю, еще хотелось бы разобрать такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream> 
 
using namespace std;
 
int main()
{
    int n, *p, **q; //объявляем указатель, переменную и указатель указателя?
    p=&n; //присваиваем значение переменной p - адрес переменной n
    q=&p; //присваиваем переменной q  адрес переменной p
    n=100;
    (*p)+=5; //разыменовываем и получаем 100, затем +5 = 105
    (**q)--; // что значит ** я не особо понял. Но если думаю правильно, то  *q=p а *p=n => **q=n
    cout <<n<<"\n"; //104
    cout <<*p<<"\n"; //104
    cout <<**q<<"\n"; //104
    cout <<p<<"\n"; //адрес 1 
    cout <<q<<"\n"; //адрес 2
    return 0;
}
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
21.11.2014, 15:17     Объясните работу указателей #7
Цитата Сообщение от serega006 Посмотреть сообщение
**q=n
молодец, правильно думаешь.

q - переменная, которая может хранить только адрес переменной, которая хранит адрес переменной типа int. это указатель на указатель.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2014, 17:03     Объясните работу указателей
Еще ссылки по теме:

C++ Объясните пожалуйста принцип работы указателей
Объясните программу сложения строк с использованием указателей C++
Объясните некоторые тонкости указателей C++
C++ Объясните суть ссылок и указателей в коде
C++ Объясните пожалуйста работу кода

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2014, 17:03     Объясните работу указателей #8
Цитата Сообщение от serega006 Посмотреть сообщение
разыменовываем и получаем 100, затем +5 = 105
Не 100, а переменную со значением 100. Если получить 100, а потом выполнить +=5, то результат будет в лучшем случае выброшен, так как значение, в данном случае 100, - это константа и в него ничего поместить нельзя, то есть результат девать некуда. Тогда надо писать
C++
1
n=(*p)+=5;
. Но так как оператор разыменования возвращает не само значение 100, а переменную, то её можно увеличивать оператором составного присваивания со сложением.

Добавлено через 49 секунд
Цитата Сообщение от serega006 Посмотреть сообщение
//объявляем указатель, переменную и указатель указателя?
Да, указатель на указатель (говорят не чей, а на что), то есть двойной указатель.

Добавлено через 3 минуты
Цитата Сообщение от serega006 Посмотреть сообщение
(**q)--; // что значит ** я не особо понял.
Декремент, то есть уменьшение на 1. Чего? **q значит *(*q). Первый оператор разыменования в выражении *q возвращает указатель на int (который у нас имеет имя p), второй в выражении *(*q) разыменует уже выражение в скобках, то есть указатель p. Почему именно p? Потому что именно его адрес лежит в q, а значит его и возвращает разыменование *q.

Добавлено через 25 секунд
Цитата Сообщение от serega006 Посмотреть сообщение
cout <<p<<"\n"; //адрес 1
адрес переменной n.

Добавлено через 22 секунды
Цитата Сообщение от serega006 Посмотреть сообщение
cout <<q<<"\n"; //адрес 2
Адрес переменной p. Да, она является указателем и сама хранит адрес. Но здесь не хранимый в p адрес, а адрес, по которому лежит сама p.
Yandex
Объявления
21.11.2014, 17:03     Объясните работу указателей
Ответ Создать тему
Опции темы

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