Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Адресс указателя  (Прочитано 899 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн olegRomanuk

  • Автор темы
  • Участник
  • *
  • Сообщений: 120
    • Просмотр профиля
Адресс указателя
« : 14 Декабрь 2013, 15:16:38 »
В общем начал изучать  С++ сам, есть вопрос.
например код
int a=5;
int *pUkazatel=&a;

указателю pUkazatel будет присвоен адрес переменной а. То есть указатель  содержит адрес переменной. Что значит содержит ? в нем записано eff012 например ? Второй вопрос а сам указатель имеет адрес? к нему же как-то обращается компилятор - значит имеет? и в каком типе памяти он содержится?
Спасибо если кто ответит

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 2262
    • Просмотр профиля
Re: Адресс указателя
« Ответ #1 : 14 Декабрь 2013, 18:42:46 »
Почитайте повнимательнее книгу по C, там всё это должно быть подробно разъяснено.
Вообще для того, чтобы писать программы на C/C++ для IBM PC, это знать
совершенно необязательно, достаточно помнить, что в указателе находится адрес.
« Последнее редактирование: 14 Декабрь 2013, 23:19:06 от Peter_I »
Пётр.

Оффлайн Progger

  • Любитель
  • *
  • Сообщений: 95
    • Просмотр профиля
Re: Адресс указателя
« Ответ #2 : 14 Декабрь 2013, 18:47:21 »
Как и любая переменная, указатель обычно имеет адрес. В данном случае он располагается на стеке после a

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Адресс указателя
« Ответ #3 : 14 Декабрь 2013, 18:53:34 »
я не знаю с, но все переменные обязательно имеют адрес
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7188
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Адресс указателя
« Ответ #4 : 14 Декабрь 2013, 19:20:38 »
olegRomanuk, про указатель на указатель слышали? Но зачем компилятору обращаться к адресу указателя? Он же не знает, какой адрес примет тот или иной указатель во время работы программы (конкретный физический адрес может быть занят другой программой или вообще отсутствовать (памяти меньше)). По сути указатель та же переменная, которая содержит адрес другой переменной и ничего больше (хотя есть и нулевой указатель). Сам указатель - это не адрес! Он лишь содержит адрес.

Оффлайн olegRomanuk

  • Автор темы
  • Участник
  • *
  • Сообщений: 120
    • Просмотр профиля
Re: Адресс указателя
« Ответ #5 : 14 Декабрь 2013, 20:35:10 »
в общем понял адрес указателя банально получаю & используя. 
#include <iostream>

using namespace std;

int main()
{


    int myage=5;
    int *p;

cout<<"pervui raz adres ukazatelya  "<<&p<<endl;
    p=&myage;
    /* Predstavim sebe 4to k nam priwel tolko ukazatel o peremenoi my ni4ego ne znaem */
cout <<" razimenoevanie ukazatelya "<<*p<<endl;
cout<<" zna4enie kotoroe  imeet ukazatel  "<<p<<endl;
cout<<" adres ukazatelya  izmenilsya li ??  "<<&p<<endl;
/*proverka */
cout<< "adres peremenoi myage "<<&myage<<endl;
if (&myage==p)
{

cout<<"ura adressa sovpali";
}

}

короче усьо стало ясно.Вроде бы  :2funny:

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5214
  • Все по палатам!
    • Просмотр профиля
Re: Адресс указателя
« Ответ #6 : 14 Декабрь 2013, 23:37:37 »
Сам указатель - это не адрес! Он лишь содержит адрес.
Понял, чего сказал? И в чем он содержит этот адрес?
Все даннные содержатся в памяти. Указатель тоже содержится в памяти и имеет адрес, но по этому адресу записан другой адрес, по которому хранятся некие данные....
Извините, я все еще учусь

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7188
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Адресс указателя
« Ответ #7 : 15 Декабрь 2013, 00:06:11 »
SergeyIT, прекрасно понял. Сам указатель - переменная, в которой содержится адрес. Стакан молока не равен молоку внутри стакана. Другое дело в том, что для нас в данном случае в этом нет никакой разницы... Подумай, если адрес на адрес содержится в памяти и на него адрес и так до бесконечности, то хватит ли тебе памяти, даже в 10100Гб для записи в память любой переменной, имеющей адрес?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5214
  • Все по палатам!
    • Просмотр профиля
Re: Адресс указателя
« Ответ #8 : 15 Декабрь 2013, 00:22:05 »
peregrine,
Ты о чем? Все переменные имеют адрес в памяти, а что по этому адресу лежит - это не важно в принципе. Главное, чтобы процессор последовательно, начиная с какого то адреса, считывал из памяти данные(команды) и выполнял их согласно системе команд. А вот данные эти положить правильно - это и есть программирование. Понятие переменная - это термин математики, который наводит только туман...
int a; в программе означает только, что по адресу &а (постоянному для данной части программы) будет записано число int (которое, в принципе, может быть и адресом другой переменной)
Извините, я все еще учусь

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7188
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Адресс указателя
« Ответ #9 : 15 Декабрь 2013, 01:37:44 »
SergeyIT, правильно. Я вот о чём: Переменная имеет адрес - верно? Указатель, содержащий адрес переменной имеет адрес. Адрес имеет адрес, адрес имеющий адрес имеет адрес и т.д. до бесконечности - явно неверно, так как всю эту бесконечность просто невозможно запихнуть в память, которая весьма конечна.
С точки зрения процессора память нумерована
(Нажмите, чтобы показать/скрыть)
и адрес на адрес не объявленного указателя не существует. Соответственно указателя на адрес последнего объявленного указателя просто не может существовать. Поясню: пусть есть переменная A. На переменную A существует объявленный нами указатель *B, на него мы объявили указатель **C на *B, указывающий на A. Больше мы ничего не объявляли. Так как **C - переменная, которая тоже имеет адрес, то этот адрес должен где-то храниться, верно? Если он хранится в другом указателе, то выйдет замкнутый круг. Вопрос: где он хранится? Теперь понятнее о чём я говорю? Как оно работает более точно я не очень представляю. SergeyIT, может быть проясните кашу в моей голове?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5214
  • Все по палатам!
    • Просмотр профиля
Re: Адресс указателя
« Ответ #10 : 15 Декабрь 2013, 01:55:03 »
peregrine,
Как то так, например
int A = 0;
int *B = &A;
int **C = &B;
Адрес в памяти    Данные
А = 00001000      00000000
B = 00001004      00001000
C = 00001008      00001004
Но данные ничего не делают. В программном сегменте записываются команды работы с этими адресами/данными согласно тексту программы и там все сложнее.
Извините, я все еще учусь

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7188
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Адресс указателя
« Ответ #11 : 15 Декабрь 2013, 02:02:24 »
SergeyIT, это и я понимаю. Вот только я говорил к тому, что адрес на данные 00001008 не должен существовать, иначе потребуется адрес на адрес 00001012 и т.д. Они что, в стеке лежат или в определённной части оперативной памяти, например в самом начале, чтоб по ним можно было ориентироваться?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5214
  • Все по палатам!
    • Просмотр профиля
Re: Адресс указателя
« Ответ #12 : 15 Декабрь 2013, 02:17:14 »
Зачем лишний адрес? Компилятор знает адрес C 00001008 и большего ему не надо, в команды процессору он его запишет. Если убрать строку с определением С, то и этот адрес не будет использоваться (если переменная С в программе не используется, то это сделает оптимизатор - удалит лишнее, чтобы память экономить). А где данные в памяти лежат зависит от места в программе и типа описания переменных. Если это глобальные переменные, то в сегменте данных. Если локальные переменные в функции, то в стеке. Если динамически созданные данные, то в куче... Точных подробностей не помню, извини.
Извините, я все еще учусь

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7188
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Адресс указателя
« Ответ #13 : 15 Декабрь 2013, 02:18:25 »
SergeyIT, спасибо, понял в чём дело.

Оффлайн olegRomanuk

  • Автор темы
  • Участник
  • *
  • Сообщений: 120
    • Просмотр профиля
Re: Адресс указателя
« Ответ #14 : 15 Декабрь 2013, 02:21:01 »
в общем мой код показывает что  указатель р а точнее я так думаю вот эта буковка р имеет определенный адрес

 

Страница сгенерирована за 0.071 секунд. Запросов: 25.