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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
WLF
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 22
#1

Обязательно ли объявлять переменную для хранения адреса переменной как указатель? - C++

09.05.2014, 09:12. Просмотров 1205. Ответов 38
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Указатели
#include <iostream>
 
using namespace std;
 
int Variable;
int *pVariable;
// int pVariable;
int main()
{
    setlocale(LC_ALL, "rus");
 
    Variable = 777;
    pVariable = &Variable;
 
    cout << "Переменная Variable\t = " << Variable << endl;
    cout << "Адрес Variable\t\t = " << &Variable << endl;
    cout << "Значение по этому адресу = " << *pVariable << endl;
    // cout << "Значение по этому адресу = " << pVariable << endl;
return 0;
}
Скажите, почему, если я объявляю переменную pVariable просто как int, а не как указатель (закомментированые строки), то компилятор ругается на типы? Разве, чтобы хранить в переменной какой-то адрес надо обязательно объявлять её как указатель?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 09:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обязательно ли объявлять переменную для хранения адреса переменной как указатель? (C++):

Как правильно объявлять struct переменную? - C++
Как правильно объявлять? str one или struct str one; #include &lt;iostream&gt; using namespace std; struct str { int a; int b; ...

Используя указатель на переменную типа string, удалить последний символ этой переменной - C++
есть указатель на переменную string,нужно удалить последний символ этой переменной работая с указателем.Как это осуществить?Заранее...

Описать класс,содержащий переменную для хранения текстовой строки. - C++
Описать класс,содержащий переменную для хранения текстовой строки.Вне класса притв функцию,которая определит какое слово встречается в...

Где объявлять переменную: перед циклом, или внутри класса - C++
Подскажите, где правильно объявить переменную. Если объявить внутри цикла, то сузится область ее видимости, но она будет объявляться...

Не обязательно разыменовывать указатель на функцию при вызове? - C++
Здравствуйте. Вот такой вопрос. void estimate(int lines, double (*pf) (int)); //прототип // ... void estimate(int lines, double...

Как использовать указатель на переменную во входящем параметре функции? - C++
Нашел код для решение гиперболического уравнение с помощью разностных схем. Возникли некоторые вопросы. Вот сам код: double...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
09.05.2014, 09:25 #2
Цитата Сообщение от WLF Посмотреть сообщение
Разве, чтобы хранить в переменной какой-то адрес надо обязательно объявлять её как указатель?
Как бы указатели для того и есть.
Можно, конечно, и в переменную типа int записать значение адреса, но вот конкретно Вам это зачем?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.05.2014, 09:36 #3
0x10, далеко не всегда можно запихнуть адрес в int. Взять хотя бы x64: адрес 64 бита, а int скорее всего 32.
WLF, компилятор ругается потому что типы не совместимы. Вы же едите суп ложкой, а не вилкой. Вот и здесь не надо путать сущности.
0
WLF
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 22
09.05.2014, 09:51  [ТС] #4
Просто мне стало интересно, почему в строке 14 в переменную спокойно записывается адрес, а строка 19 не работает.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.05.2014, 09:57 #5
WLF, как это не работает? Если раскомментировать 19 строку, то будет выведен адрес, так же как в 17 строке.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
09.05.2014, 09:58 #6
Пруф: http://ideone.com/kwbHEN
0
WLF
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 22
09.05.2014, 10:03  [ТС] #7
Цитата Сообщение от Tulosba Посмотреть сообщение
как это не работает? Если раскомментировать 19 строку, то будет выведен адрес, так же как в 17 строке.
А теперь раскомментируйте строку 8, а 7 и 18 закомментируйте.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.05.2014, 10:08 #8
WLF, приведите пожалуйста полностью код, который Вас смутил. Без "расскоментируйте"/"закомментируйте". Так будет нагляднее и точнее. Чтобы не было недопонимания.
0
WLF
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 22
09.05.2014, 10:16  [ТС] #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Указатели
#include <iostream>
 
using namespace std;
 
int Variable;
int pVariable;
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    Variable = 777;
    pVariable = &Variable;
 
    cout << "Переменная Variable\t = " << Variable << endl;
    cout << "Адрес Variable\t\t = " << &Variable << endl;
    cout << "Значение по этому адресу = " << pVariable << endl;
 
return 0;
}
Code::Blocks ругается:
|14|error: invalid conversion from 'int*' to 'int' [-fpermissive]|

Может быть он ругается потому, что адрес сохраняется в hex-формате (т.е. с символом 'x')?
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
09.05.2014, 10:25 #10
Нельзя так просто взять и привести указатель к целому числу. Типы разные.
Грубо говоря:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int Variable;
int pVariable;
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    Variable = 777;
    pVariable = reinterpret_cast<int>(&Variable);
 
    cout << "Переменная Variable\t = " << Variable << endl;
    cout << "Адрес Variable\t\t = " << &Variable << endl;
    cout << "Значение по этому адресу = " << hex << pVariable << endl;
 
    return 0;
}
И не забывать о разрядности, что было сказано в 3 посте.
0
newbie666
Заблокирован
09.05.2014, 10:26 #11
Цитата Сообщение от WLF Посмотреть сообщение
14|error: invalid conversion from 'int*' to 'int' [-fpermissive]|
ну конечно, ты ж пытаешься указатель присвоить обычной переменной
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.05.2014, 10:31 #12
WLF, почему у Вас вообще возникла мысль, что указатель (а ведь адрес переменной это указатель) может быть так просто преобразован и сохранен в целочисленной переменной?

Hex - это всего лишь способ представления информации для человека. Так что в данном случае Вы сказали глупость.
0
WLF
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 22
09.05.2014, 10:34  [ТС] #13
Ну так указатель, как я понял, это же обычная переменная в которой хранится адрес. Адрес - это просто число. Так почему я не могу поместить в обычную переменную (пусть даже это будет long int) какое-то число, которое я интерпретирую как адрес.
И вообще, почему вывод происходит в шестнадцатиричном формате, а не в десятичном?

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
почему у Вас вообще возникла мысль, что указатель (а ведь адрес переменной это указатель) может быть так просто преобразован и сохранен в целочисленной переменной?
А почему нет? (см. выше)
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
09.05.2014, 10:36 #14
Цитата Сообщение от WLF Посмотреть сообщение
Ну так указатель, как я понял, это же обычная переменная в которой хранится адрес.
Физически - да.
Цитата Сообщение от WLF Посмотреть сообщение
Так почему я не могу поместить в обычную переменную (пусть даже это будет long int) какое-то число, которое я интерпретирую как адрес.
В языке это разные типы данных.
Цитата Сообщение от WLF Посмотреть сообщение
И вообще, почему вывод происходит в шестнадцатиричном формате, а не в десятичном?
Потому что есть перегрузка operator<< для указателя http://www.cplusplus.com/reference/o...perator%3C%3C/, где и реализован вывод в hex-формате.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2014, 10:41 #15
Цитата Сообщение от WLF Посмотреть сообщение
Так почему я не могу поместить в обычную переменную (пусть даже это будет long int) какое-то число, которое я интерпретирую как адрес.
Во-первых откуда тебе известно, что это число туда влезет? Указатель же, объявленный с помощью звёздочки, гарантирует, что такое число туда поместится. Во вторых как инкрементить будешь? Типизированный указатель инкрементится оператором ++ сразу на размер ячейки, на которую указывает, а не к соседнему байту. И при вычитании двух указателей получается количество ячеек, которые межу этими адресами можно поместить. Например,
C++
1
2
3
4
5
int *p1;
int *p;
size_t n;
...
n=p1-p2;
поместит в n количество четырёхбайтных ячеек, а не количество байт, которые помещаются между двумя адресами. В-третьих ты как собираешься обращаться к данным, которые лежат по хранимому в long int адресу? Единственный возможный синтаксис такого обращения - это привести long int к указателю, а потом этот указатель разыменовать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2014, 10:41
Привет! Вот еще темы с ответами:

Можно ли как-то словить номер элемента используя указатель, а не переменную - C++
void Print(int *arr, const int *size) { for (int *p = arr, n=0; p &lt; arr + *size; p++) cout &lt;&lt; &quot; - &quot; &lt;&lt; *p &lt;&lt; endl; cout &lt;&lt;...

Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и почтового ад - C++
Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и...

Как вывести на экран переменную из функции, которой присваиваеться значение через указатель? - C++
Только начал изучать С++. И не могу понять, как вывести на экран переменную pdLocalVar из функции child(), которой присваивается значение в...

Как объявлять указатель на массив указателей? - C (СИ)
Народ, поясните как объявлять указатель на массив указателей и как отправлять его как параметр в функцию


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.05.2014, 10:41
Ответ Создать тему
Опции темы

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