Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2010, 07:45   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Адрес переменной

Прочитал в книге вот такое:
Цитата:
@ - получение адреса
А как с помощью @ получить адрес переменной?
Пробовал так:
Код:
Var
     A:Integer;
     P:Pointer;
Begin
        P:=@A;
        Writeln(^P);
        Readln;
End.
Однако на экран выводится странный треугольничек, скрин прилагаю.
http://s1.ipicture.ru/uploads/20101230/p72WFhRr.jpg
_-Re@l-_ вне форума Ответить с цитированием
Старый 30.12.2010, 09:17   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Во-первых,
Код:
 Writeln(P^);
А, во-вторых, вы переменную не инициализировали... что вы хотели увидеть?
p51x вне форума Ответить с цитированием
Старый 30.12.2010, 09:24   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Во-первых,
1. Ага, захотел. Я так делал, так он пишет Cannot Read or Write variable of this type. Так что ха.
Цитата:
А, во-вторых, вы переменную не инициализировали... что вы хотели увидеть?
2. А вот это по делу.


P.S. Переменную инициализировал, но результат тот же.
_-Re@l-_ вне форума Ответить с цитированием
Старый 30.12.2010, 09:35   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а так?
Код:
Var
  A:Integer;
  P:Pointer;
Begin
  A := 1234;
  P:=@A;
  Writeln(Integer(P^));
  Readln;
End.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.12.2010, 09:54   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

О Майн Гот... Неужели книг не читаем?
Код:
Var
     A:Integer;
     P:^Integer;
Begin
        P:=@A;
        Writeln(P^);
        Readln;
End.
Цитата:
_-Re@l-_
Читай матчасть про указатели в паскале, про типированые и нетипированные
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 10:14   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Serge_Bliznykov, Stilet, вы меня не поняли. В ваших программах просто pointer'у присваивается значение переменной.
А мне нужно получить адрес, по которому располагается переменная. Вот аналог на С++:
Код:
#include <iostream>
#include <stdio>
#include <stdlib>
#include <conio.h>

int main()
{
  int x;
  cout.setf(ios::hex);
  cout.unsetf(ios::dec);
  cout<<"Адрес  = "<<&x<<endl;
  getch();
  return 0;
}
_-Re@l-_ вне форума Ответить с цитированием
Старый 30.12.2010, 10:48   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Эх... Ну почему меня никто не слушает?...
Если бы почитал про указатели то понял бы что их можно приводить к типу целого:
Код:
Writeln(integer(P));
P - Указатель
Р^ - Значение по его адресу.
Еще раз повторюсь - матчасть! Особенно в старых советских книгах.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 11:01   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Всё равно таким образом адрес переменной не получить, только значение! Ну как же вы не понимаете.
В этом случае
Код:
#include <iostream>
#include <stdio>
#include <stdlib>
#include <conio.h>

int main()
{
  int x;
  cout.setf(ios::hex);
  cout.unsetf(ios::dec);
  cout<<"Адрес  = "<<&x<<endl;
  getch();
  return 0;
}
Результатом будет шестнадцатеричное число-адрес местонахождения переменной, типа 0x4567df8 - что нибудь такое. А в ваших примерах просто значение переменной.
_-Re@l-_ вне форума Ответить с цитированием
Старый 30.12.2010, 11:21   #9
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Адрес переменной имеет размер в 4 байта(Integer). Pointer - нетипизированный указатель. Если мы напишем Writeln(P), то откуда программа узнает какого размера указатель? Ведь writeln не перегружена для вывода указателя. Поэтому нам нужно привести указатель к какому-то типу. В нашем случае логичнее всего привести к Integer. То есть, как сказал Stilet, Writeln(Integer(p));
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 30.12.2010, 11:23   #10
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Так, ладно, понял. Сделал.
А вот можно ли вывести его в шестнадцатеричном виде?
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адрес переменной _-Re@l-_ Общие вопросы .NET 3 25.12.2010 16:58
Адрес переменной kostyan777 Общие вопросы C/C++ 4 11.07.2010 22:16
Адрес переменной: Вопрос Black-Sparkle Общие вопросы C/C++ 11 11.08.2009 14:59
Снова про адрес переменной Pedro Общие вопросы Delphi 2 17.12.2008 21:53
Адрес переменной Pedro Общие вопросы Delphi 11 16.12.2008 13:03