Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.11.2014, 23:50. Просмотров 302. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните работу указателей (C++):

Объясните некоторые тонкости указателей - C++
Всем добрый вечер. Вот так выглядит сам код: //Программа объявляет указатель на массив типа double, затем выделяет память, заполняет и...

Объясните пожалуйста принцип работы указателей - C++
#include &lt;iostream&gt; using namespace std; int main() { int *p,num; p = &amp;num; *p=100;

Объясните суть ссылок и указателей в коде - C++
Всем добрый день! В общем, есть код (не судите, что примера попроще я не подобрал, просто подумал, что лучше я спрошу прям на деле),...

Объясните программу сложения строк с использованием указателей - C++
// Программа на СИ ))) #include &lt;stdio.h&gt; int main() { char string1; char string2; ...

Объясните работу кода - C++
Здравствуйте, не могу понять работу следующего кода: #include &lt;iostream&gt; using namespace std; int main() { char buff =...

Объясните работу указателя - C++
Зарание спасибо ) Короче дело было так ): Помог мне друг в проге, работать то работает а вот на защите заали мне вопросик из кода...

7
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4138 / 2269 / 561
Регистрация: 18.10.2014
Сообщений: 3,880
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"???
1
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
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, то получим фатальный егог.
1
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
21.11.2014, 10:29 #4
Цитата Сообщение от serega006 Посмотреть сообщение
(*p)++; // почему эта операция происходит раньше p = &n и q = p?
она не происходит раньше. *p - дает нам значение, лежащее по адресу, хранящемуся в p, а ++ увеличивает значение 100 на 1.
1
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
21.11.2014, 10:30 #5
Цитата Сообщение от serega006 Посмотреть сообщение
cout << *q << endl; // здесь мы получаем 101
Адреса то равны, ты разыменуешь q, получая переменную по адресу q, выше ты увеличил до 101 переменную по адресу p, но p и q - это один и тот же адрес.
1
serega006
8 / 8 / 2
Регистрация: 16.10.2011
Сообщений: 371
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;
}
0
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
21.11.2014, 15:17 #7
Цитата Сообщение от serega006 Посмотреть сообщение
**q=n
молодец, правильно думаешь.

q - переменная, которая может хранить только адрес переменной, которая хранит адрес переменной типа int. это указатель на указатель.
0
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
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.
1
21.11.2014, 17:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2014, 17:03
Привет! Вот еще темы с ответами:

Объясните работу ф-ии memmove - C++
Я не понимаю как работает ф-ия memmove. Объясните пожалуйста на простом, доступном языке, как она работает.

Объясните работу функции - C++
Объясните некоторые моменты из программы. Функция ReplaceKey заменяет ключ отображения map Что такое value_type(newKey,...

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

Объясните работу функции fread() - C++
Возникла проблема при чтении файла по частям. Вообщем задача состоит в том что нужно считывать 64 байта с файла, записывать их в некий...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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