|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
Указатели23.06.2011, 20:08. Показов 6416. Ответов 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 | |
|
Помогаю со студенческими работами здесь
40
Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Зачем нужны все эти указатели (или не указатели)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|