C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Пояснение указателей  (Прочитано 1461 раз)
farrell
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 162


Пояснение указателей
« : 10 Ноябрь 2010, 11:14:12 »

При работе с указателем таким образом, то выдается ошибка

Код
  int *p=NULL;
 *p=5;   //нельзя так делать

чтобы заработало нужно делать через посредника так

Код
  int f=1;
 int *p=NULL;
 p=&f;
 *p=5;

а если работать в динамической памяти то можно так

Код
  int *p1 = new int;
 *p1=5;
 delete p1;

Вопрос в том, как грамотно объяснить почему нельзя делать так как в первом случае?
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: Пояснение указателей
« Ответ #1 : 10 Ноябрь 2010, 11:34:36 »

Что такое указатель? Это переменная, содержащая адрес (т.е. значение переменной - адрес). В первом примере адрес при объявлении установлен в NULL, т.е. адреса нет. Ежели попытаться присвоить значение по адресу NULL, то результат будет немного предсказуем .
Во втором примере переменной p присваивается адрес переменной f; & - знак операции взятия адреса. Теперь по адресу переменной f присваивается значение 5.
В третьем примере при инициализации переменной p1 выделяется память и присваивается адрес. Далее - операция разадресации (*), и присвоения значения 5 по полученному адресу. Следующей строкой память, выделенная под переменную p1, удаляется. Но! Адрес все так же остается присвоенным. Желающие могут убедиться под отладчиком. Но! Попытка обращения по этому адресу вызовет ошибку доступа к памяти - AV (Access Violation).
Записан
Ramzay
Участник


Сказали спасибо: +14/-0
Offline

Сообщений: 179


Re: Пояснение указателей
« Ответ #2 : 10 Ноябрь 2010, 11:43:47 »

когда ты пишешь int *p=NULL (нагляднее int*  p=NULL)ты объявляешь переменную типа "указатель на int" и присваиваешь этому указателю значение NULL;
Таким образом, у тебя появляется переменная p, которая содержит указатель на адрес в оперативной памяти.

Когда ты пишешь *p - имеется ввиду указатель, который указывает на переменную p. Это значение можно получить, но присаивать значение, как ты делаешь, *p=5; нельзя. Иначе, ты получаешь адрес и с помощью присваивания пытаешься его изменить. Так нельзя. Что бы изменить адрес напиши просто p=5;
« Последнее редактирование: 10 Ноябрь 2010, 11:49:17 от Ramzay » Записан
farrell
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 162


Re: Пояснение указателей
« Ответ #3 : 10 Ноябрь 2010, 11:49:05 »

Цитата: Ramzay от 10 Ноябрь 2010, 11:43:47
когда ты пишешь int *p=NULL (нагляднее int*  p=NULL)ты объявляешь переменную типа "указатель на int" и присваиваешь этому указателю значение NULL;
Таким образом, у тебя появляется переменная, которая содержит указатель на адрес в оперативной памяти.

Когда ты пишешь *p - имеется ввиду указатель, который указывает на переменную p. Это значение можно получить, но присаивать значение, как ты делаешь, *p=5; нельзя. Иначе, ты получаешь адрес и с помощью присваивания пытаешься его изменить. Так нельзя. Что бы изменить адрес напиши просто p=5;

вообще-то выполнить p=5 не позволит компилятор, и выведит Cannot convert 'int' to 'int *'
Записан
Ramzay
Участник


Сказали спасибо: +14/-0
Offline

Сообщений: 179


Re: Пояснение указателей
« Ответ #4 : 10 Ноябрь 2010, 11:56:01 »

Cannot convert 'int' to 'int *' - возможно, я запамятовал. Но суть не в этом.

У тебя есть переменная p и ей можно присваивать значение. Присваивать значение адреса 5 - это полный бред и выполнение программы может привести к непредсказуемым последствиям.

Если ругается компилятор можно воспользоваться операцией "приобразования типа"
p= (int*) 5; // числовое значение с типом int и значением 5 преобразовывается в тип int*
Записан
Ramzay
Участник


Сказали спасибо: +14/-0
Offline

Сообщений: 179


Re: Пояснение указателей
« Ответ #5 : 10 Ноябрь 2010, 12:06:22 »

Вообще-то адресная арифметика это одна из сильнейших сторон языка С теперь и С++.

Конечно, присваивать переменной p значение 5 не стоит. Но можно делать так

int a=0;  // переменная типа int
int* p;   // переменная типа указатель на int
p=&a;    // переменной типа "указатель на int" присваиваем значение адреса переменной a (&a- обозначает "получение адреса" a)
            // кстати, значение переменной p можно посмотреть в отладчике
int b=*p; // Значение переменной b будет равно значению пременной a (*p - обозначает "значение указателя" p)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.133 секунд. Запросов: 20.