Вопросы по указателям

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

Как я понял, указатель - это переменная, которая содержит адрес другой переменной.

* - этот оператор открывает доступ к значению ячейки памяти.

Если a=1; *b

b=&a - так мы присвоим адрес переменной a переменной b
printf("%d",*b) - выведем значение которая хранит ячейка памяти переменной a

Тогда что это значит b=(int*)a? :D
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

lekha писал(а):Тогда что это значит b=(int*)a?
Не знаю, зачем это и связяно ли с предыдущими примерами...
Адрес - это тоже некоторое число. Оператор b=(int*)a говорит, что рассмотривать число, которое хранится в a как адрес переменной типа int и сохранить этот адрес в переменной-указателе b.
Конструкция (int*) означает "приведение типа".
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

Извиняюсь, что долга не отвечал.
Ясно, спасибо, что помогаешь :) , но мне непонятно, почему если мы рассматриваем некоторое a как адрес переменной типа int. Как вообще у типа может быть адрес? И почему например, если я выдам эту конструкцию, будет показано не адрес этого числа, а значение, которое мы записали в этот адрес?
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

lekha писал(а): И почему например, если я выдам эту конструкцию, будет показано не адрес этого числа, а значение, которое мы записали в этот адрес?
Потому что ты сам сказал компилятору, что значение в а - это адрес, что же ты хочешь увидеть? Если адрес, где хранится a, то напиши, например, так:

Код: Выделить всё

cout<<&a;
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):Как вообще у типа может быть адрес?
У типа не может быть адреса. Адрес может быть у переменной, собственно, что мы и наблюдаем.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

Код: Выделить всё

#include <stdio.h>
#include <conio.h>
#include <string.h>


main()
{
 int *a; int b=3;
 a=(int*)b; // Мы рассматриваем число как адрес переменной b типа int, поэтому благодаря этой конструкции амперсанд
 // не нужен???
 
 printf("%d",a); // Почему при "*" здесь выскакивает ошибка?   
      
      
 getch();
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Нет не так! Постарайся понять вышесказанное.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

lekha писал(а):// Мы рассматриваем число как адрес переменной b типа int,
Всякий адрес - это число. Чтобы это осознать, достаточно вывести через тот же printf значение переменной a(которая объявлена как int *a).

Но "обратное" неверно. Т.е. не всякое число можно интерпретировать как адрес. Т.е. попробовать-то можно, но на какую ячейку памяти "указывает" произвольное число, и что там вообще находится (хотя ЧТО-ТО там, конечно же, находится) - тайна сия велика есть.

Возьмите обычные адреса. Номера дома и квартиры - это тоже ЧИСЛА :) Но не для всякого числа существует дом/квартира с таким номером.
Условно говоря, если Вы напишете на конверте "от балды" взятые название улицы, номера дома/квартиры, то, не исключено, что такой адрес существует. Но кто там живет (и кто получит письмо) - это совершенно непредсказуемо.
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

Всякий адрес - это число. Чтобы это осознать, достаточно вывести через тот же printf значение переменной a(которая объявлена как int *a).
То есть здесь мы задаем адрес переменной?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

lekha писал(а):То есть здесь мы задаем адрес переменной?
Эээ... Вопрос не понятен.
Ответить