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

Работа с указателями

02.08.2017, 21:38. Показов 1259. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

Не понимаю, почему в следующем коде

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
using namespace std;
 
int * max (int *p, int *q)
{  
    int *pmax = p;
    for ( ; p!=q; ++p) {
        if (*pmax < *p) {
            pmax = p;
        }
    }
    return pmax;
}
 
 
 
int main()
{
  int arr[8] = {1, 3, 4, 6, 2333, 2, 5, 66};
  int *pmax = max(arr, arr+8);
  cout <<pmax<< endl<< *pmax;
  
  return 0;
}
эта строка

C++
1
int *pmax = p;
присваивает *pmax значение равное единице, разве значение не должно быть равно адресу, на который указывает p?

при этом, если до

C++
1
int *pmax = p;
сделать вывод p
C++
1
cout<<p<<endl;
то даст адрес
0x7fff2b091580
если затем
C++
1
cout<<&p<<endl;
то даст другой адрес
0x7fff2b091548

почему другой???

Если же после строки
C++
1
int *pmax = p;
сделать вывод уже *pmax
C++
1
cout<<*pmax<<endl;
выведет значение 1
почему, мы же разве не присвоили туда адрес (0x7fff2b091580)?

Дальше, с циклом

C++
1
2
3
4
5
for ( ; p!=q; ++p) {
        if (*pmax < *p) {
            pmax = p;
        }
    }
Понятно вроде бы все, мы двигаемся по адресам в массиве до конца.
Но
Если *pmax меньше значения, лежащего в адресе, то присваиваем... что куда?
C++
1
pmax = p;
В этой строке адрес pmax меняется на адрес большего элемента в массиве?

Если все же p адрес, то почему в начале при присваивании
C++
1
*pmax = p;
присваивается-то не адрес?

Еще дальше в майне
C++
1
2
int *pmax = max(arr, arr+8);
  cout <<pmax<< endl<< *pmax;
функция выдает значение, записанное в адресе pmax?
*pmax становится равным значению, которое находится по адресу, полученному из функции.
и если вывести просто pmax в майне, то выведется адрес, который аналогичен адресу, полученному в конце функции, но я не понимаю почему.

Надеюсь, вопрос не превратился в кашу.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2017, 21:38
Ответы с готовыми решениями:

работа с указателями
небольшая проблемка, никак не могу разобраться с указателями. Я так понял что создавая массив лучше если сразу сдалешь на него указатель и...

Работа с указателями
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void fun(int *p) { int *temp=new int; *temp=15; delete p; ...

работа с указателями в
Всем приятного дня, друзья, вынужден просить вас помощи в написании следующей задачи: Присвоить разыменованному указателю на тип Т1...

3
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
02.08.2017, 22:29
Лучший ответ Сообщение было отмечено lex_dura как решение

Решение

Цитата Сообщение от lex_dura Посмотреть сообщение
Если же после строки
C++
1
int *pmax = p;
Вот так попробуйте вывести:
C++
1
std::cout << pmax << std::endl;
Что покажет?

Добавлено через 1 минуту
C++
1
int *pmax = p;
В этой строке вы определили указатель на тип int, инициализировали его значением адреса. Если в последующих строках писать
C++
1
*pmax
, то это получится разыменовывание указателя. Т.е. вы берете то, что находится по этому адресу. Если же писать просто pmax, то это будет сам адрес.
1
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 3
02.08.2017, 22:51  [ТС]
Цитата Сообщение от Nishen Посмотреть сообщение
Что покажет?
Адрес такой же, как у p)
Спасибо! Не обратила внимания, что там и определение в строке.

т.е. запись
C++
1
int *pmax = p;
идентична
C++
1
2
int *pmax;
pmax = p;
p это тоже ведь уже сам адрес, теперь яснее)

А что же тогда происходит, когда мы выводим

C++
1
cout<<&p;
мы берем адрес у адреса?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
03.08.2017, 00:48
Цитата Сообщение от lex_dura Посмотреть сообщение
А что же тогда происходит, когда мы выводим
C++
1
cout<<&p;
мы берем адрес у адреса?
p - указатель (переменная, содержащая адрес), и у него есть адрес, вот его и выводим, т.е., не значение указателя (адрес в нём), а адрес самого указателя.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2017, 00:48
Помогаю со студенческими работами здесь

Работа с указателями
Доброго времени суток, нужна помощь. Данный две задачи, обе работают правильно: Дан целочисленный массив размера N. Преобразовать...

работа с указателями
Помогите решить задачу в С++ (я в этом начиющий): 1)Из положительных значений двух целочисленных массивов различной размерности...

Работа с указателями
Помогите пожалуйста объяснить, не понимаю почему число присваемое через указатель *А в кавычках, и равны ли *А и просто А??? char *A =...

Работа с указателями
Расскажите как работает каждая строка в коде char *A = &quot;123456789&quot;; unsigned B = 1; char *X = A + B; char *Y = A - (-...

работа с указателями
Вспоминаю с++ и в связи с этим возникло несколько вопросов. 1) если сделать так : myobj *obj = new myobj(); то потом можно...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru