БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
1 | |
Указатели23.06.2011, 20:08. Показов 5473. Ответов 54
Метки нет (Все метки)
1) Указатель можно инициализирвоать только с помощью операции *p=&a? А как записать адрес переменной в простую переменную (я пытался это делать через операцию b=&a, но компилятор ругается, говорит, что операция &a возвращает указатель.
2) Почему имеет значение тип указателя? Ведь это просто ссылка на переменную. И еще один вопрос, не касающийся указателей: 3) Как программа узнает, какие места ОЗУ ей можно занимать (не заняты др. программой), а какие - нет.
0
|
23.06.2011, 20:08 | |
Ответы с готовыми решениями:
54
Указатели и указатели на указатели, а также типы данных Через указатели на указатели посчитать сумму двух чисел и записать в третье Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей? Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком |
25.06.2011, 17:14 | 41 | |||||
Добавлено через 3 минуты Таблица сопоставления адресов (так, кажется) находится в памяти ядра операционки. Не знаю на счёт винды, но unix'ы должны выделять одной программе более 4 гигов памяти. При начале выполнения программы ей выделяется меньше памяти, но страницы реальной памяти пришиваются к её виртуальной по мере необходимости. Ну и освобождаются, соответственно. Добавлено через 1 час 10 минут Нет, виртуальная память - это огромная последовательность байт, которые доступны программе для хранения в ней каких-либо значений. Программа втыкает эти значения в разные места виртуальной памяти. Указатель - это число, которое показывает, в каком месте виртуальной памяти находится начало объекта (переменной, структуры, массива...). Виртуальная память с точки зрения программы непрерывна, а с точки зрения операционки, она фрагментирована, и фрагменты лежат в разных местах физической памяти, может даже не по порядку или даже в свопе. Операционка делает так, чтобы (1) программа не задумывалась о том, где реально находится её память и как к ней подобраться и (2) чтобы две программы сидели каждая в своём виртуальном адресном пространстве и не портили друг другу данные. Добавлено через 18 секунд Извините, не сразу заметил апдейт
1
|
25.06.2011, 18:15 | 42 |
В Windows 32 - разрядных виртуалка начинается 64-kb со свободного блока с нулевым адресом, выгружаемый пул ядра от 0xE1000000 до 0xECFFFFFF = 192mb для хранения динамических структур компонентов ядра. Все пользовательские процессы загружаться в нижнюю часть 2gb-виртуальной памяти а системные верхнию часть dll/sys - драйверы устройств только в верхней области виртуальной памяти доступен весь блок памяти процессов 4gb, все системные модули такие как gdi32, kernel32, user32 и т.п, работают для всех пользовательских процессов в одном экземпляре, также можно создать общий модуль для всех процессов.
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
||||||
25.06.2011, 18:44 | 43 | |||||
Допустим есть две запущенные программы. Для каждой система выделила виртуальную память.
Адрес начала этой виртуальной памяти 0x00000000? А теперь представим, что эти две программы одинаковые. Тогда будут ли виртуальные адреса переменных совпадать? Если да, то почему эта программа выводит разные адреса, если ее несколько раз запустить? :
1
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
25.06.2011, 18:59 | 44 |
Chelioss, потому как КАЖДАЯ запущенная программа - это отдельеный процесс, для которого создается отдельный дескриптор и свои таблицы страниц виртуальной памяти. Каждый отдельный процесс имеет собственную виртуальную память и соотеветстсенно, никак не пересекающуюся с другими процессами реальную. Реальная тоже может совпадать, так как страницы могут распределяться таким образом.
Далее, каждый процесс еще и СОБСТВЕННЫЙ стек имеет. А все локальные переменные - они в стеке... Это не зависит, одна и та же прога запускалась или разные.
2
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|||||||||||
25.06.2011, 20:21 [ТС] | 45 | ||||||||||
talis, спасибо за объяснение.
Но вопросы еще остались. Ядро ОС - это ОЗУ, как я понимаю? А почему такой код:
Мне еще не до конца понятно, почему здесь все говорят, что операция &a возвращает адрес переменной, а не указатель. Но ведь (повторюсь) возвращаемое значение имеет тип type* - тип указателя, а следовательно, это не адрес (простое число), а указатель! Не могли бы вы сказать, отличаются ли следующие явные приведения типов технически:
И хотелось бы узнать, конструкции, подобные static_cast<type_to>(variable) обрабатываются по ходу программы или на уровне компилятора? В смысле, может ли пользователь создавать подобные конструкции? (с угловыми скобками etc). int во 2-ом случае вызывается как функция или это обрабатывается компилятором по-особому? И 3-ий вариант тоже весьма интересен. Почему нельзя записать просто b=int a? Заранее благодарю за ответы. Добавлено через 2 минуты Отдельные-то они отдельные, но в "продуктовом" файле под переменную всегда выделяется одно и то же место в виртуальной памяти. (или нет?) У меня, к примеру, всегда высвечивается один и тот же адрес переменной.
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
25.06.2011, 20:54 | 46 |
почитай Таненбаума "Современные операционные системы" ну или как то так название и все вопросы отпадут. А то вопросы и выводы у тебя мягко говоря странные, например как это
по пути ещё ассемблер освой, непонимание основ подводит тебя и из-за этого ты какую то фигню размусолил аж на пять страниц
0
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
25.06.2011, 20:57 [ТС] | 47 |
pito211, позже я доберусь и до ассемблера, однако пока хочется узнать механизмы.
0
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
25.06.2011, 21:11 | 48 |
да уже сто раз тут все механизмы обсудили, указатели разжевали как только могли, а ты до сих пор задаёшь одни и те же вопросы. Про виртуальную память всё подробно расписано в книге, которую я привёл выше. Может лучше её открыть, а не дёргать других людей по пустякам, уж наверно у них есть дела поважнее, чем цитирование литературы, находящейся в свободном доступе? Накрайняк можно в педивикию заглянуть
Добавлено через 4 минуты и если ты не понял чего то про указатели, то это целиком из-за пробелов в знаниях. Значит тут два варианта - заполнить пробелы или оставить как есть Добавлено через 1 минуту на этот вопрос в книге таненбаума целая глава есть ВАП
1
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
25.06.2011, 21:14 [ТС] | 49 |
pito211, в моей книге этих нюансов не описывается, а главу "Указатели" я полностью прошел. Я не заставляю никого помогать и не испытываю злобу на людей этого форума, которые мне не помогают Но будьте добры, не заводите впредь эту тему, если конкретную литературу вы не посоветуете. А эта тема действительно будет полезна не только мне, но и другим новичкам, ведь здесь все изложено кратко.
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
25.06.2011, 21:23 | 50 |
Hagrael, немного про адреса и указатели.
Память - это массив байтов. А элементы массива, как ты знаешь, ПРОНУМЕРОВАНЫ. От 0 до n-1. В 32-битной машине этот массив имеет размер 2^32 = 4 гб. Номер элемента памяти - это и есть адрес. Это положительное целое число. Указатель - это переменная, которая хранит этот номер-адрес. В С++ принято, что при выводе на экран значение указателя (целое число-номер элемента памяти) выводится в шестнадцатеричной системе.
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
26.06.2011, 10:30 | 51 | |||||
С этим связана одна проблема:
Добавлено через 13 минут Не будет никакого конфликта, так как по данному адресу в локальном виртуальном адресном пространстве (именно так, виртуальная память - это вообще файл на винчестере, ни какого отношения он сюда не имеет, а работает с ним единственная программа - операционная система, так что в нём как раз только физические адреса) нет других программ, чьи данные и код могли оказаться по указанному адресу. Я уже писал про отсебячьи карты, так вот, это карты разных райнонов, у каждой проги свой.
0
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|||||||||||
26.06.2011, 10:34 [ТС] | 52 | ||||||||||
Странная вещь у меня тут возникла. Вот код:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.06.2011, 10:35 | 53 |
0
|
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
|
|
26.06.2011, 10:36 [ТС] | 54 |
Непонятно вообще, зачем массив делают константой.
0
|
Заблокирован
|
|
26.06.2011, 11:38 | 55 |
Существует небольшая проблема:
int m[]; int * p = m; // or int * p = &m[0]; В рантайме невозможно в принципе узнать, какой тег следует приписать указателю - массив или нет. Однако, есть безопасная функция, которая позволяет узнать сколько было заявлено при new [количество] ??? И да, кстати: int* iPtr = new int [10]; delete [] iPtr; Как вы видите, при удалении данных не нужно указывать явное количество. Напрашивается вывод: реализация delete[] знает точное количество элементов. Внимание вопрос: если нечто знает количество элементов, на кой чорт это количество дополнительно помнить? Вопрос номер два: как узнать, какое количество элементов было выделено с помощью new[] Варианты с шаманством над адресами не предлагать. Существует безопасная функция. Вопрос номер три: как узнать, на какое количество элементов вообще ссылается указатель iPtr ? У кого и как об этом можно спросить? Главный вопрос номер четыре: Как научить клиентский код различать указатель на объект от указателя на массив? Добавлено через 36 минут см. идеологию "строгой типизации". А так же "почему истовый профессионал сыплет константами везде, где только можно". /ps константность иногда убивает инкапсуляцию.
0
|
26.06.2011, 11:38 | |
26.06.2011, 11:38 | |
Помогаю со студенческими работами здесь
55
Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Зачем нужны все эти указатели (или не указатели) Указатели на указатели, как правильно разыменовать, где ошибка? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |