Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.69
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
#1

Понимание адреса, ссылки и указателя - C++

30.05.2012, 11:31. Просмотров 4993. Ответов 103
Метки нет (Все метки)

Гм... Конечно, стремно создавать подобную тему, однако, уж очень захотелось понять все это дело. Правда сколько раз ни пытался - не удавалось ни разу, возможно, потому что пытался разобраться самостоятельно (хотя, наверное, многие это постигают именно так). Но вот моя очередная попытка, которую решил так сказать обнародовать Поэтому очень рассчитываю на вашу помощь и поддержку.

Итак, начал практически с самого начала и уже сразу же зашел в тупик.
Ниже приведен легенький код, демонстрирующий расположение переменных в памяти компа.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// расположение переменных в памяти
#include <cstdio.h>
#include <cstlib.h>
#include <iostream.h>
 
using namespace std;
 
int main(int intArgc, char* pszArgs[])
{
int end;
int n;
long l;
float f;
double d;
 
// Вывод в шестнадцатеричном виде
cout.setf (ios::hex);
cout.unsetf (ios::hex);
 
// выводить адреса переменных
// по очереди, чтобы показать размер
// каждой переменной
cout << "--- = " << &end << "\n";
cout << "&n = " << &n << "\n";
cout << "&l = " << &l << "\n";
cout << "&f = " << &f << "\n";
cout << "&d = " << &d << "\n";
 
system ("PAUSE");
return 0;
}
Результат:

C++
1
2
3
4
5
--- = 0x22ff6c
&n  = 0x22ff68
&l  = 0x22ff64
&f  = 0x22ff60
&d  = 0x22ff58
А теперь цитата из книги:
Обратите внимание на то, что переменная n располагается ровно в 4 байтах от переменной end (---). Переменная l располагается еще на 4 байта ниже, а переменная типа double занимает 8 байт. Для каждой переменной выделяется память, необходимая для ее типа.
Для каждой переменной выделяется память, необходимая для ее типа.
Это мне известно. Но вот что меня занесло в тупик:

Разница, скажем, между 0x22ff6c и 0x22ff68 действительно 4. Но 4 чего - байта? А разве 4 в десятичной системе не 4? А в двоичной это разве не 100? Откуда тут 4 байта? Я понимаю, что там должно быть 4 байта, но не получается осознать, что 1 hex-единица у нас вдруг байт. Или это не так?

В общем, на таком банальном я запутался

Спасайте...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 11:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Понимание адреса, ссылки и указателя (C++):

Изменение адреса указателя - C++
Здравствуйте. Обращаюсь к форуму по следующему вопросу: как можно изменить значение указателя? То есть, есть следующий код: ...

Динамическое указание адреса указателя - C++
мне нужно сделать int * a=(int*)0x123ff; cout&lt;&lt;a; динамически. Кто нибудь знает как это сделать?

Использование ссылки и указателя - C++
Доброго времени суток! Возник такой вопрос, есть код: #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() ...

Получение адреса объекта после обнуления указателя на этот объект - C++
Добрый вечер уважаемые программисты. Интересует следующий вопрос. Есть ли способ получить адрес объекта, после того, как указатель на него...

Передача ссылки и указателя в функцию - C++
передал ссылку в одну функцию - нормально, передал в другую - выводит неверное значение, тоже самое с указателем. Как можно это исправить?

Возвращение ссылки или указателя на закрытый элемент класса. - C++
Всех уважаемых форуман. поздравляю с наступившим новым годом и прошу ответить на такой вопрос. Почему до сих пор современный C++ не...

103
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 17:51 #76
И читай:
Цитата Сообщение от taras atavin Посмотреть сообщение
Адрес, по которому валяется указатель
. Сам указатель, а не переменная x.
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
31.05.2012, 17:53  [ТС] #77
Цитата Сообщение от The_Immortal Посмотреть сообщение
Так почему мусор этот не перезаписывается?
Вот блин, уже на ерунде какой-то застреваю. Все понял, спасибо ребят!


Цитата Сообщение от taras atavin Посмотреть сообщение
Нет, адреса значения не существует.
Хм... А вот это интересно.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 17:56 #78
Как двойному указателю будешь присваивать значение?
C++
1
2
3
int x=2;
int *p=&x;
int **pp=&(*p);
? Не правильно. Правильно просто
C++
1
2
3
int x=2;
int *p=&x;
int **pp=&p;
. А значение указателя - это адрес.

Добавлено через 1 минуту
Цитата Сообщение от The_Immortal Посмотреть сообщение
Хм... А вот это интересно.
C++
1
2
3
4
5
int x;
int *p;
x=5; // x и равен 5
p=&x; // правильно
p=&5; // не правильно: хоть x и равно 5, но 5 адреса не имеет.
0
alkagolik
Заблокирован
31.05.2012, 17:58 #79
Цитата Сообщение от The_Immortal Посмотреть сообщение
Хм... А вот это интересно.
не ведись, он сам не понял что написал. Ссылка есть разыменованный константный указатель, т.е. сам указатель и хранить в программе не надо пойми. Создается просто дубликат переменной.

Добавлено через 2 минуты
taras atavin, разбирай
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
indicator@indicator:~$ cat test.cc
#include <iostream>
 
using namespace std;
typedef unsigned uint32;
 
int main() {
 
    int x = 9;
    int* const p = &x;
    int &s = x;
 
    cout << &(*p) << '\n' << &x << '\n' << &s << endl;
 
    return 0;
}
indicator@indicator:~$ g++ test.cc
indicator@indicator:~$ ./a.out 
0xbf921dd4
0xbf921dd4
0xbf921dd4
indicator@indicator:~$
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 17:58 #80
Значения не имеют индивидуальности, а значит и адресов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int x;
int y;
int *p;
x=5;
y=5;
p=&5; // адрес какой из пятёрок надо поместить в указатель?
/*То есть какая из переменных должна удвоиться следующей сточкой?*/
*p=*p*2;
if (x<y) // Какой символ надо вывести?
{
 cout<<"x";
}
else
{
 cout<<"y";
}
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
31.05.2012, 17:59  [ТС] #81
У меня сейчас взорвется мозг))


alkagolik, с утверждением
Цитата Сообщение от taras atavin Посмотреть сообщение
адреса значения не существует.
Я пожалуй соглашусь.
Адрес может быть только переменной, которая может содержать какое-либо значение, согласны?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 18:02 #82
А x - это именно x при любом равенстве хоть зету, хоть игреку.

Добавлено через 2 минуты
Цитата Сообщение от alkagolik Посмотреть сообщение
не ведись, он сам не понял что написал. Ссылка есть разыменованный константный указатель, т.е. сам указатель и хранить в программе не надо пойми. Создается просто дубликат переменной.
Ссылка - синоним, а не понял ты. Ссылка во многих случаях ведёт себя, как разыменованный константный указатель. Пока не доберёшься до её адреса и внутренне реализации, где и начнутся сюрпризы. Указатели же хранятся и имеют собственные адреса.
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
31.05.2012, 18:03  [ТС] #83
C++
1
2
3
4
5
6
7
int x;
int y;
int *p;
x=5;
y=5;
 
p=&5;

Да как это понять?...

По всей памяти будет разыскиваться переменная со значением 5? Окей, найдем их две, что будем делать? Адрес которой из них будем брать? Адрес переменной y, т.к. он будет меньше адреса переменной x (возвращаясь к теме с тарелками ) ?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 18:05 #84
Цитата Сообщение от The_Immortal Посмотреть сообщение
Разница, скажем, между 0x22ff6c и 0x22ff68 действительно 4. Но 4 чего - байта? А разве 4 в десятичной системе не 4? А в двоичной это разве не 100? Откуда тут 4 байта? Я понимаю, что там должно быть 4 байта, но не получается осознать, что 1 hex-единица у нас вдруг байт. Или это не так?
В общем, на таком банальном я запутался
Спасайте...
Значение с размером попутал.
C++
1
int x=4;// На самом деле значение не 100, а 00000000000000000000000000000100
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.05.2012, 18:06 #85
Цитата Сообщение от taras atavin Посмотреть сообщение
p=&5; // не правильно: хоть x и равно 5, но 5 адреса не имеет.
Вот что меня недавно позабавило, так это то, что этот код тоже рабочий. Можешь проверить.) Я был удивлён.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 18:06 #86
Цитата Сообщение от The_Immortal Посмотреть сообщение
Да как это понять?...
Не переживай, компилятор со Срауструпом этого тоже не понимают.
1
alkagolik
Заблокирован
31.05.2012, 18:08 #87
taras atavin, при чем тут значения. Разыменованный указатель это не значение, это память, на которую он ссылается. http://liveworkspace.org/code/c04aa20472ea792a0bd3a75d3bd60438
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 18:08 #88
Цитата Сообщение от Deviaphan Посмотреть сообщение
Вот что меня недавно позабавило, так это то, что этот код тоже рабочий. Можешь проверить.)
Проверка.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 18:10 #89
Цитата Сообщение от alkagolik Посмотреть сообщение
taras atavin, при чем тут значения. Разыменованный указатель это не значение, это память, на которую он ссылается.
И всё равно &(*p) не правильно, так как если *p - память, то &(*p) - её адрес, то есть значение указателя, а мне нужен его адрес, то есть адрес, по которому записан адрес. А это просто &p.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.05.2012, 18:12 #90
Цитата Сообщение от taras atavin Посмотреть сообщение
Проверка.
Блин, вы и меня запутали уже.)))
Я имел в виду код int & r = 5;

Приношу искрение извинения за проявленное нубство.)
0
31.05.2012, 18:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2012, 18:12
Привет! Вот еще темы с ответами:

Ссылки и адреса - C++
Вот, где лучше всего использовать адреса и ссылки? Просто не много не понятня для чего это все. Вот например эту запись int mas; int*...

Адресное пространство, адреса, ссылки - C++
Добрый вечер. Я новичок в программировании и стал недавно читать туториалы по ссылкам. В общем, прилагаю цитату с одного сайта: ...

Как снять константность ссылки для передачи в функцию адреса - C++
Здравствуйте. Есть функция с сигнатурой: void func(const tm &amp; _tm); В теле функции надо вызвать: time_t _mkgmtime( struct tm*...

При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? - C++
Hi All! class SomeObj { public: int x; }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
90
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru