1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|||||||||||
1 | |||||||||||
Понимание адреса, ссылки и указателя30.05.2012, 11:31. Показов 8172. Ответов 103
Метки нет (Все метки)
Гм... Конечно, стремно создавать подобную тему, однако, уж очень захотелось понять все это дело. Правда сколько раз ни пытался - не удавалось ни разу, возможно, потому что пытался разобраться самостоятельно (хотя, наверное, многие это постигают именно так). Но вот моя очередная попытка, которую решил так сказать обнародовать Поэтому очень рассчитываю на вашу помощь и поддержку.
Итак, начал практически с самого начала и уже сразу же зашел в тупик. Ниже приведен легенький код, демонстрирующий расположение переменных в памяти компа.
Разница, скажем, между 0x22ff6c и 0x22ff68 действительно 4. Но 4 чего - байта? А разве 4 в десятичной системе не 4? А в двоичной это разве не 100? Откуда тут 4 байта? Я понимаю, что там должно быть 4 байта, но не получается осознать, что 1 hex-единица у нас вдруг байт. Или это не так? В общем, на таком банальном я запутался Спасайте...
1
|
30.05.2012, 11:31 | |
Ответы с готовыми решениями:
103
Изменение адреса указателя Вывод адреса указателя Динамическое указание адреса указателя Как сохранить значение адреса указателя в обычную переменную? |
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
31.05.2012, 14:20 | 41 |
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|||||||||||
31.05.2012, 15:12 [ТС] | 42 | ||||||||||
Ух, мужики, ну Вы тут и заварили
В общем, из всего, что я прочел я так и не понял, что такое ссылка. В смысле вот это я понимаю. И, кстати, огромное спасибо, что пытаетесь донести подобными примерами - очень ценю это, т.к. действительно помогает. Но все же без формализации в итоге никак. У меня просто в голове не укладывается, как две переменные могут сидеть по одному адресу... Или это чисто логический прием? И это также непонятно. Разве может ссылка (по своему назначению должна на что-то ссылаться) указывать на ничто? Хотя вот указатель же необязательно инициализровать, так? Соответственно он может быть пустым почему-то... Просто насколько я понимаю, то указатель также имеет свой адрес, правильно? Имею в виду сам по себе указатель, как переменная. И он, разумеется, не совпадает с адресом, на который этот указатель указывает. Но вот что с ссылкой... Она своего адреса не имеет что ли... Имею в виду саму по себе ссылку. Добавлено через 7 минут А это я тоже с трудом понял, примерно вот так (задача корявая, т.к. формулировал сам):
0
|
31.05.2012, 15:18 | 43 | ||||||||||
Ссылка как только объявляется сразу инициализируется
типа
а вот указатель можно присвоить потом или вообще в (NULL) то есть в ноль.В книгах так написано. типа int *p;
0
|
Заблокирован
|
||||||
31.05.2012, 15:24 | 44 | |||||
да, лишь забыл уточнить что ссылка есть константный разыменованный указатель. Всегда привязан к одной области (переменной) вот пример
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||||||
31.05.2012, 15:24 [ТС] | 45 | |||||
Borkot, да, спасибо (жаль "спасибо" мои закончились).
1
|
31.05.2012, 15:27 | 46 | |||||
Я почему спросил по поводу указателей
Укзатель
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
31.05.2012, 15:32 [ТС] | 47 |
alkagolik, большое спасибо за пример! Буду разбирать его.
Borkot, Да вот это по-моему бред. Что за книга такая?
0
|
Заблокирован
|
|
31.05.2012, 15:38 | 48 |
да собственно ничего страшного. Правда этого просто не нужно. В данном случае p хранит адрес px, по которому позже записывает ее же адрес, т.е. значение px равно адресу px. Подвох в том что адреса не имеют отрицательных значений и следовательно представлены беззнаковым типом, а px объявлена как знаковое целое.
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
31.05.2012, 15:44 [ТС] | 49 |
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|||||||||||
31.05.2012, 15:47 | 50 | ||||||||||
Ты абсолютно прав. Вариант, когда ты был бы не прав, я чуть выше нарисовал, это когда int **p;
Поэтому шняжные книжки лучше не читать.) Щяс разжую. есть код
По указателям. р расположен по адресу 0x0022ff04 и по этому адресу записан адрес переменной v 0x0022ff08. Добавлено через 1 минуту Только нужно сделать оговорку, что это действительно только для 32 битной системы и, что компилятор будет страшно ругаться.
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|||||||||||
31.05.2012, 16:01 [ТС] | 51 | ||||||||||
Deviaphan, по первому мини-кодику усе ясно, второй же код мой мозг пока не осилил - чуть позже еще попробую
Просто я, если честно, ответа не уловил И с трудом пока понимаю необходимость использования и ссылок и указателей (да и вообще их вместе взятых ). Ведь ссылка - частный случай указателя. Или наоборот... Ну как бы это разве не равносильно:
Вот еще такой вопрос созрел: как можно вывести на экран то, что в данный момент хранит указатель? К примеру:
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||||||
31.05.2012, 16:13 [ТС] | 53 | |||||
alkagolik, у меня ругается:
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
31.05.2012, 16:15 | 54 |
В исходной задаче используются указатели на знаковый int. То что без ворнингов, это косяк компилятора. Попробуй х64 версию собрать и будут тебе ворнинги. И не правильно работающая программа.
Добавлено через 50 секунд И вообще, ты явное преобразование сделал. По условию вопроса там неявное преобразование.
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||||||
31.05.2012, 16:16 [ТС] | 55 | |||||
С uint32 тоже ругается:
0
|
Заблокирован
|
|
31.05.2012, 16:17 | 56 |
The_Immortal, конечно ругается. у тебя изначально указатель указывает в неизвестность, хранит в себе мусор. ты его проинициализируй каким - то адресом, а уж потом используй. Ты пытаешься разыменовать мусор.
Добавлено через 59 секунд Deviaphan, конечно. без преобразования и не скомпиляется. Грязные методы.
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
31.05.2012, 16:19 [ТС] | 57 |
Да, с явным ничего не говорит (не ругается), но прога у меня вылетает при запуске.
Добавлено через 58 секунд alkagolik, Сделал
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
31.05.2012, 16:19 | 58 |
Нет. Результатом твоего примера r не изменится.
Так же, как и присвоить ему значение. cout << *у. Между ними нет ничего общего. Это тебя запутали фразами типа "разыменованный указатель". Фактически, основная разница в том, что ссылку нужно инициализировать при создании. Т.е. вместо указателя ты можешь написать 0, а вот с ссылкой это не пройдёт. А что использовать, ссылку или указатель, это уже дело вкуса. О тонкостях, связанных с оптимизацией кода, лучше не волнуйся.
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
31.05.2012, 16:20 [ТС] | 59 |
0
|
Заблокирован
|
||||||
31.05.2012, 16:26 | 60 | |||||
5 букв
Добавлено через 1 минуту
разве? а не так? int &x == int* const point;
0
|
31.05.2012, 16:26 | |
31.05.2012, 16:26 | |
Помогаю со студенческими работами здесь
60
Передача указателя в функцию, присвоение адреса переменной и возврат Получение адреса объекта после обнуления указателя на этот объект выделение памяти при увеличении адреса указателя на размерность int Отличие ссылки от указателя Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |