2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
|
||||||
1 | ||||||
Выделение памяти для указателя07.07.2016, 22:11. Показов 4131. Ответов 20
Метки нет (Все метки)
Помогите пожалуйста разобраться в одном примере:
Видимо я не понял как устроены указатели. Я подумал, что когда указатель ссылается на какой-либо элемент он сохраняет это значение в ячейке памяти и соответственно размер указателя должен быть равен размеру типа, на который он указывает. Но потом нашел инфу о том, что указатель хранит в ячейке памяти адрес другой ячейки, на которую он собственно и ссылается. В общем, действительно это так, почему указателю нужно в данном случает 4 байта и всегда ли указатель занимает только 4 байта?
0
|
07.07.2016, 22:11 | |
Ответы с готовыми решениями:
20
Создание указателя на объект и выделение памяти Динамическое выделение памяти / Передача указателя на строку в функцию выделение памяти при увеличении адреса указателя на размерность int Ссылка, Указатель, Область памяти выделенная оператором new для указателя |
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
|
|
07.07.2016, 22:22 | 3 |
Говорили, что есть случаи, когда больше (или может я не совсем верно понял), но классический указатель зависит от архитектуры: для x86 - 4, для x64 - 8.
1
|
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
|
|
07.07.2016, 22:24 | 4 |
nmcf, да, верно.
0
|
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
|
|
07.07.2016, 22:27 | 5 |
1
|
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
|
|
07.07.2016, 22:32 | 6 |
nmcf, да. Стормозил чего-то.
Не заметил, что вы уже дали ответ, поэтому изменил то сообщение.
0
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 455
|
||||||
07.07.2016, 22:43 | 7 | |||||
Тип указателя и тип элемента на который он указывает - разные типы и они не обязаны быть равны по размеру друг другу.
В х86 4 байта для указателя, х64 - 8. Как уже выше сказали.
2
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
|
07.07.2016, 22:55 | 8 |
Сообщение было отмечено Iron Brain как решение
Решение
добавлю-ка я и свои пять копеек
указатель хранит адрес и размер его должен быть достаточен чтобы этот адрес полностью влез для современных линейных систем для 32битных систем память адресуется от 0 до 4Гб (232-1) достаточно 32 бит что и есть 4 байта для 64битных максимальная ячейка 264-1 соответственно 64 бита или 8 байт когда появятся 128битные системы будет 16 байт а вот во времена ДОС указатели были разные память там адресовалась сегмент: смещение каждый из элементов 16 бит соответственно были короткие указатели(near) 2 байта, указывал на ячейку в том же сегменте и длинные(far) 4 байта, чтобы хранить и сегмент и смещение
3
|
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
|
|
07.07.2016, 22:59 [ТС] | 9 |
ValeryS, ну моя система 64 бит, почему тогда указатель равен 4 байтам?
0
|
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
|
|
07.07.2016, 23:08 [ТС] | 11 |
ValeryS, а выбор разрядности программы нужно смотреть в настройках ide или в коде можно прописать? Как мне это сделать в VS community?
0
|
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
|
|
07.07.2016, 23:17 | 13 |
В настройках проекта.
1
|
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
|
|
07.07.2016, 23:26 [ТС] | 15 |
ValeryS, я уже нашел. Разрядность программы выбирается одним кликом в верхней панели инструментов прямо рядом с кнопкой запуска отладки, но я никогда на это не обращал внимания
2
|
Комп_Оратор)
|
||||||
08.07.2016, 00:24 | 16 | |||||
Iron Brain, размер массива из трёх double равен утроенному размеру double. Это связано со стандартом:
IEEE 754 (IEEE Standard for Binary Floating-Point Arithmetic ) и не зависит от разрядности OS. То есть, 8 байт. Размер указателя (на что бы то ни было) зависит от разрядности адресной шины системы и OS. То есть, 4 или 8 байт (или 16 или 10500) . То что указателю можно присвоить массив не означает того, что это одно и то же и имеет один размер. Имеет место неявное приведение типа массива к указателю. Попробуйте так:
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
08.07.2016, 00:31 | 17 |
Ну, доведу уж, до десяти. Если сейчас сказать "COM" - кто-то вспомнит Component object model, кто-то RS-232, а кто-то, все-таки, формат исполняемых файлов доса. Т.к. там был один сегмент на все - модель памяти была плоская - как сейчас. И, следовательно, только near указатели.
2
|
IGPIGP
|
08.07.2016, 09:49
#19
|
Не по теме: Командный файл компактен и быстр. Это не экзешник, конечно. Хоть и ограничен одним сегментом. Вообще, на этих болотах новичку легко и потеряться. Ужасти сумеречные: near, far...
Сообщение от "Гемпширская трясина. Техническое описание"
0
|
avgoor
|
08.07.2016, 14:24
Выделение памяти для указателя
#20
|
0
|
08.07.2016, 14:24 | |
Что если для указателя на ноль выделить место в динамической памяти? выделение памяти для массива Выделение памяти для строки Выделение памяти для массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |