|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
Указатели23.06.2011, 20:08. Показов 6973. Ответов 54
Метки нет (Все метки)
1) Указатель можно инициализирвоать только с помощью операции *p=&a? А как записать адрес переменной в простую переменную (я пытался это делать через операцию b=&a, но компилятор ругается, говорит, что операция &a возвращает указатель.
2) Почему имеет значение тип указателя? Ведь это просто ссылка на переменную. И еще один вопрос, не касающийся указателей: 3) Как программа узнает, какие места ОЗУ ей можно занимать (не заняты др. программой), а какие - нет.
0
|
|
| 23.06.2011, 20:08 | |
|
Ответы с готовыми решениями:
54
Указатели и указатели на указатели, а также типы данных Через указатели на указатели посчитать сумму двух чисел и записать в третье Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей? |
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||
| 24.06.2011, 20:45 | ||
|
Hagrael, ваши предположения не верны, ничего никуда автоматически не подставляется. И, ещё раз, звёздочка при объявлении относится к типу, а не к переменной, так что ваше *p = &a; в принципе не верно, даже если забыть про то, что тип надо указывать. Выражение int *p = &a; нужно читать как (int *)p = &a; (скобки для понятности). Т.е. вот это int * и есть ваш тип pointer. А если писать p = &a;, как компилятор поймёт, что мы хотим работать с p как с указателем, а не как просто с целым числом? Конечно, он мог бы предположить что-то, но его предположение могло бы оказаться неверным. Указывая же тип явно, мы сообщаем, что переменная p является указателем на тип int (int *), и компилятор всё обработает верно.
1
|
||
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
||
| 24.06.2011, 20:56 [ТС] | ||
|
Все, с типом указателей разобрался, спасибо.
0
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 24.06.2011, 20:58 | |
|
Hagrael, я не понимаю, что вы под этим подразумеваете? Сегмент кода? Сегмент данных? Всё вместе?
1
|
|
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
||||||
| 24.06.2011, 21:04 [ТС] | ||||||
|
silent_1991, я подразумеваю память под, если так можно сказать, процесс. К примеру вот такая у меня программа:
0
|
||||||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 24.06.2011, 21:09 | |
|
Hagrael, если уж речь зашла о процессе, то будет выделено ровно столько, сколько может вместить машинный код, в который был скомпилирован исходник, поскольку при выполнении программный код должен быть полностью загружен в оперативную память. На стеке же под две автоматические переменные типа int будет выделено 8 байт.
Добавлено через 1 минуту А зачем нужен резерв, вы можете пояснить? Уже на этапе компиляции известно, под сколько переменных и каких типов необходимо выделить память. Динамических объявлений в C++ нету. Поэтому всё выделение памяти заключается в передвигании вершины стека на нужное количество байт.
1
|
|
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
| 24.06.2011, 21:10 | |
|
0
|
|
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
| 24.06.2011, 21:12 [ТС] | |
|
Спасибо за объяснение, но могу ли я полагать, что память будет составлять в итоге размер_файла + размер_переменных байт?
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 24.06.2011, 21:18 | |
|
Chelioss, я имел ввиду, что переменные нельзя объявлять на этапе выполнения.
Hagrael, если вы в дальнейшем не будете динамически выделять память, то да, можете.
1
|
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 25.06.2011, 04:36 | ||
|
А уж отображением виртуалки в реальную память занимается подсистема управления страничной памятью операционной системы. Меньше одной страницы не бывает, а это - 4 килобайта. Так что не заморачивайтесь экономией памяти. Будете экономить, когда столкнетесь с физической памятью непосредственно...
2
|
||
|
Заблокирован
|
|
| 25.06.2011, 05:10 | |
|
Ну, наверное, смысл не в том, что бы экономить память, а в том что бы эффективно её использовать.
Дабы избежать всевозможных потерь из-за перезаписи кусков данных с места на место, проблем с переносимостью из-за выравнивания данных, всевозможных фрагментаций кучи, кеш-промахов и тп.
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||||||||||||||||||||
| 25.06.2011, 07:11 | ||||||||||||||||||||||||||||||||||
|
Добавлено через 32 минуты
Добавлено через 19 минут
1
|
||||||||||||||||||||||||||||||||||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 25.06.2011, 08:33 | ||
|
0
|
||
|
Заблокирован
|
||
| 25.06.2011, 09:07 | ||
|
Это такой прозрачный намёк в сторону пула памяти) Сэкономим на new/delete и конструкторах/диструкторах. Заодно обезопасим код от всяких мерзких исключений, возможных утечек памяти и бла бла бла.
0
|
||
|
|
||
| 25.06.2011, 10:58 | ||
|
Добавлено через 5 минут Не по теме: А вообще, тему надо советовать к прочтению новичками - уж очень много вопросов и ответов в ней сконцентрировано
1
|
||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||||||||||||||||||||||||
| 25.06.2011, 11:54 | ||||||||||||||||||||||||||||||||||||||
|
Добавлено через 5 минут
Добавлено через 1 минуту
Добавлено через 3 минуты Добавлено через 59 секунд Добавлено через 1 минуту Добавлено через 1 минуту
Добавлено через 4 минуты Добавлено через 1 минуту Добавлено через 4 минуты Добавлено через 4 минуты
Добавлено через 3 минуты Добавлено через 2 минуты Добавлено через 3 минуты Добавлено через 1 минуту Добавлено через 1 минуту
1
|
||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||
| 25.06.2011, 11:58 | |||||||||||||||||
0A 1B C4 C8 14 00 08 42 38 31 AA 89 C1 F7 F8 F0 01 FF BC 04 0A 1B C4 C8 14 00 08 42 То есть мы знаем, что у нас есть массив, который имеет в себе 8 элементов, каждый размером sizeof(short), то есть у меня это 2 байта. И у нас есть адрес начала этого массива, скажем, 2048 (напишу в десятичной для наглядности). То есть адрес 5-го элемнта массива будет 2048 + (5 * sizeof(short) ) = 2048 + (5 * 2) = 2048 + 10 = 2058. И начиная с адреса 2058 нам надо считать 2 байта, чтобы прочитать этот элемент массива. Зная это, компилятор может заранее сделать код для доступа к i-му элементу массива ( array[i] ). Вот формула: 2048 + ( i * 2 ). Если адрес на этапе компиляции не известен, но мы имеем указатель на начало этого массива, то можем сделать так: ptr + ( i * 2 ). Допустим, ptr содержит 3072, а i имеет значение 7. Дальше по аналогии: 3072 + 7 * 2 = 3072 + 14 = 3086. И начиная с адреса 3086 читаем 2 байта и получаем значение элемента ptr[i]. То есть компилятор, зная размер элемента массива (ну или тупо переменной), генерирует код для доступа к этой переменной, и, исходя из того же размера элемента, генерирует код считывания этого количества байт из памяти. На этапе выполнения нам просто не нужно знать тип переменной, весь необходимый код уже сгенерирован при компиляции. А как вы думаете, почему можно легко сделать
1
|
|||||||||||||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 25.06.2011, 11:59 | ||
|
0
|
||
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
||||||||||||||
| 25.06.2011, 15:24 [ТС] | ||||||||||||||
|
Итак, почему надо указывать тип для указателя? Ведь компилятор может узнать тип переменной, на которую указатель указывает! Ответ: Да, компилятор может сделать приведение типов, но куда лучше, чтобы программист сам понимал, на переменную какого типа будет указывать указатель. Поэтому разработчики языка решили, что пусть лучше будет обязательным объявление типов у указателей. Так ведь, да?
Я понимаю, что про память я рано заговорил, но все-таки. Физическая память - память, работа с которой ведется исключительно на аппаратном уровне, программы и не знают, что это такое. Она имеет адрес - номер (вот только в байтах или в битах?). А виртуальная память - память, с которой работают программы. По поводу второй мне не очень понятно, что она из себя представляет. Вот физическая память - это биты в ОЗУ, а виртуальная - это что? Каждая программа думает, что она одна. Обеспечивает эту сладкую иллюзию для эгоистки-программы операционная система. Но мне не до конца понятно вот что: в коде откомпилированного файла не хранится точный адрес переменной, по которому ее надо записать. Ведь если так будет, то по этому адресу может находиться другая переменная, и возникнет конфликт. Как я понимаю, программа спрашивает адрес у ОС. Вот как я это вижу:
Кст., в указателе, как я понимаю, хранится виртуальный адрес, да?
0
|
||||||||||||||
|
|
||||||
| 25.06.2011, 15:38 | ||||||
|
0
|
||||||
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
||
| 25.06.2011, 15:59 [ТС] | ||
|
За схему большое спасибо, значит, что виртуальная память так же идет на винчестер.
И вот ряд утверждений, поправьте меня, пожалуйста, если я ошибусь: 1) Виртуальная память - 16-ричное число, которое и содержится в указателе; 2) У нескольких программ могут быть одинаковые виртуальные адреса; 3) Ячейки массива в физ. памяти далеко не всегда расположены последовательно, как в виртуальной. Добавлено через 10 минут А где хранятся связки Вирт. адрес => Физ. адрес? В .tmp файле? И может ли ОС выделить одной программе более 4 ГБ памяти? И зачем ОС такие колосальные объемы - 2 ГБ? И точно ли в Windows под начало выполнения программы выделяется 4 ГБ памяти? Может ли быть выделено меньше? А то у меня столько процессов, не верится, что на каждый уходит по 4 ГБ.
0
|
||
| 25.06.2011, 15:59 | |
|
Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Зачем нужны все эти указатели (или не указатели)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|