Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
9 / 9 / 6
Регистрация: 16.10.2011
Сообщений: 423

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

20.11.2014, 23:50. Показов 833. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2014, 23:50
Ответы с готовыми решениями:

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

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

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

7
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
20.11.2014, 23:54
Цитата Сообщение от 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
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2014, 10:29
Цитата Сообщение от 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
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
21.11.2014, 10:29
Цитата Сообщение от serega006 Посмотреть сообщение
(*p)++; // почему эта операция происходит раньше p = &n и q = p?
она не происходит раньше. *p - дает нам значение, лежащее по адресу, хранящемуся в p, а ++ увеличивает значение 100 на 1.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2014, 10:30
Цитата Сообщение от serega006 Посмотреть сообщение
cout << *q << endl; // здесь мы получаем 101
Адреса то равны, ты разыменуешь q, получая переменную по адресу q, выше ты увеличил до 101 переменную по адресу p, но p и q - это один и тот же адрес.
1
9 / 9 / 6
Регистрация: 16.10.2011
Сообщений: 423
21.11.2014, 14:51  [ТС]
Благодарю, еще хотелось бы разобрать такой код:
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
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
21.11.2014, 15:17
Цитата Сообщение от serega006 Посмотреть сообщение
**q=n
молодец, правильно думаешь.

q - переменная, которая может хранить только адрес переменной, которая хранит адрес переменной типа int. это указатель на указатель.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.11.2014, 17:03
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2014, 17:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru