БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
1 | |
Указатели23.06.2011, 20:08. Показов 5461. Ответов 54
Метки нет (Все метки)
1) Указатель можно инициализирвоать только с помощью операции *p=&a? А как записать адрес переменной в простую переменную (я пытался это делать через операцию b=&a, но компилятор ругается, говорит, что операция &a возвращает указатель.
2) Почему имеет значение тип указателя? Ведь это просто ссылка на переменную. И еще один вопрос, не касающийся указателей: 3) Как программа узнает, какие места ОЗУ ей можно занимать (не заняты др. программой), а какие - нет.
0
|
23.06.2011, 20:08 | |
Ответы с готовыми решениями:
54
Указатели и указатели на указатели, а также типы данных Через указатели на указатели посчитать сумму двух чисел и записать в третье Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей? Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком |
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
|
||||||
23.06.2011, 20:12 | 2 | |||||
нет. Варианты
читай про структуру ВАП и управление памятью в ОС
1
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
23.06.2011, 20:19 | 3 |
важно также, что не *p=&a,
а p=&a; если не при объявлении конечно
1
|
23.06.2011, 20:20 | 4 | |||||
и даже так:
int *p=(int*)123456; А как компилятор узнает, сколько байт по этому адресу ему нужно использовать (прочитать/записать)? Плюс арифметика указателей:
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
23.06.2011, 20:21 | 5 |
OstapBender, а при объявлении звёздочка относится к типу, а не к переменной, так что всё равно p = &a;
1
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
23.06.2011, 20:27 | 6 |
silent_1991, да я понял, что про объявление не совсем точно написал. ну все равно чисто визуально может показаться что пишется *p = ... =)
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||||||||||
24.06.2011, 06:50 | 7 | ||||||||||
Можно сделать так:
1
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
||||||||||||||||
24.06.2011, 11:20 [ТС] | 8 | |||||||||||||||
Спасибо за различные способы, но последний я не до конца понял. Там, что, int используется как класс? И что означает size? Буду признателен, если вы объясните.
Я, кажется, понял! Операция &a возвращает указатель, однако указатель можно преобразовать в простой тип int! Почему именно указатель, а не простой тип (который можно было бы преобразовать в указатель)? Потому, что гораздо чаще с этой операции нужно получить указатель, чем сам адрес, и потому для быстроты разработчики решили, что операция &a должна возвращать указатель. Все верно? ОК. А вот это интересно! Тогда, выходит, ты сам задаешь адрес для указателя? И если так, то такой код:
И снова еще один способ преобразовать тип переменной! Да сколько их там вообще?))
Хм. Теперь у меня возник такой вопрос: Как вообще программа узнает, сколько байт имеет та или иная переменная? Вот к примеру код:
Код
Присвоить переменной a значение 5.5 Код
Присвоить переменной а значение 5.5 без дробной части
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
||||||
24.06.2011, 11:46 | 9 | |||||
0
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
24.06.2011, 11:48 [ТС] | 10 |
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
||||||
24.06.2011, 11:55 | 11 | |||||
конечно.
адресс
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
24.06.2011, 12:03 | 12 | |||||
это означает выделение динамическое выделение памяти под массив размером size
1
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
24.06.2011, 12:04 [ТС] | 13 |
Но она же возвращает переменную с типом type*. А такие переменные называются указателями. Чем является адрес?
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
24.06.2011, 12:07 | 14 |
Адрес он и в африке адрес. Натуральное число, являющееся адресом в памяти, по которому расположена переменная типа type.
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
24.06.2011, 12:14 | 15 |
0
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
24.06.2011, 13:02 [ТС] | 16 |
Большое спасибо, Nameless One, за такое хорошее изложение!
То есть тип также хранится в ОЗУ? О_о Если так, то у указателей какой-то специфический тип. Будь он int, double или каким-либо другим, все равно под него выделяется 2 блока памяти: число - размер типа; и число - адрес. Таким образом, выходит, что указатель любого типа имеет одинаковый размер. Это так? Так это приводит к ошибке потому, что там не выделена память или потому что та память не входит в допустимую для моей программы? Разве полное отсутствие "включенных" битов не свидетельствует просто о нуле? Если свидетельствует, то ошибки из-за того, что память не выделена, быть не должно. Но зачем тогда писать int* p=&a;, достаточно просто написать *p=&a;? Размер переменной a ведь уже известен.
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
24.06.2011, 15:11 | 17 |
для инта и дабла всё прорсто - выделяется память для инта и для дабла 4 и 8 байт соответсвенно(к примеру). Но если ты с помощью new выделяешь память для неинтегральных типов, то там действительно кладётся некоторый заголовок, чтобы знать потом как удалять delet[]-ом + этой инфой пользуется dynamic_cast<>() и typeid(), только тип ещё желательно делать полиморфным, то есть какую-нибудь функцию сделать виртуальной или деструктор. Если ты попытаешься применить typeid для неполиморфного типа то в теории на этапе компиляции компилятор должен всё подставить, последний факт лично не проверял, но где то читал что должно быть так
Добавлено через 2 минуты динамик_каст только что проверил на этапе компиляции обругался из-за того что тип не полиморфный
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
24.06.2011, 16:15 | 18 |
Тип хранится в ОЗУ только во время компиляции. В том и суть статической типизации - во время выполнения программы не нужно знать никаких дополнительных данных о типах, они все были известны во время компиляции, поэтому во время компиляции же компилятор расставил все необходимые смещения статически, они теперь вшиты в код бинарника и на этапе выполнения не могут быть изменены.
Ага, так и есть)) А зачем нам использовать разные размеры? Указатель должен вместить ровно такое число, сколько максимально блоков памяти мы можем адресовать, больше и не надо. Не важно, что хранит указатель, ведь и int, и double, и все остальные типы будут располагаться в одной и той же, адресуемой нами, памяти. А разве это не одно и то же? Память в том месте в любом случае есть. Выделение памяти - это же не какой-то цех по заделыванию дыр в памяти свежатинкой. Выделение просто говорит системе: "отдай-ка мне, пожалуйста, память вот такого размера". Система ищет место, где был бы свободный непрерывный блок определённого размера, и возвращает адрес этого блока программе. Это если упрощённо. Да, размер a известен. Но когда мы будем работать с указателем, а не с самой переменной, как компилятор узнает, что указатель указывает именно на переменную типа int?
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
24.06.2011, 16:27 | 19 |
Потому что С статически типизирован, а механизм вывода типов (как в Haskell'е, например), в нем отсутствует. Поэтому аннотации типов в нем обязательны.
под размер ничего не выделяется, т.к. информация о размере переменной нужна только во время компиляции (т.е. в процессе генерации машинного кода), но не в процессе выполнения. Каких битов?
1
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
||||||
24.06.2011, 20:32 [ТС] | 20 | |||||
Большое всем спасибо за ответы!
Вы имеете в виду, что выделенная память - это память, которая выделена для приложения или память, выделенная под переменные? Или это одно и то же, и термин "блок памяти, выделенный для приложения" всего лишь условный, и на самом деле приложению дается ровно столько байт, сколько нужно для его переменных (что вполне логично)? Я имел в виду вот что:
Хм. Да, все манипуляции с типами проводятся еще компилятором, но разве компилятор не может сам добавить int (как написано выше)? pito211, простите, но из вашего сообщения я мало что понял, т. к. со многими вещами, которые вы там упомянули, пока не знаком.
0
|
24.06.2011, 20:32 | |
24.06.2011, 20:32 | |
Помогаю со студенческими работами здесь
20
Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Зачем нужны все эти указатели (или не указатели) Указатели на указатели, как правильно разыменовать, где ошибка? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |