Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переменная не получает знач-е переменной по ссылке 
V
    Опции темы
hoz
Дата 15.2.2014, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



 Читаю учебник, касательно указателей. Вот попался такой код:
Код

#include <iostream>
using namespace std;

int main()
{
    int var1 = 11;
    int var2 = 22;
    
    cout << &var1 << endl
         << &var2 << endl;
    
    int* ptr;
    
    ptr = &var1;
    cout << ptr << endl;
    
    ptr = &var2;
    cout << ptr << endl;

    return 0;
}


Код прекрасно компилируется и на выходе вижу:
Код

0xbfcac278
0xbfcac27c
0xbfcac278
0xbfcac27c


По скольку хочется въехать ы данную тему, я решил проверить как ведёт себя компилятор в различных вариациях. Изменил строку?
Код

int* ptr;


на такую:
Код

int ptr;

При компиляции возникает ошибка:
Код

Ошибка компиляции     time: 0 memory: 3340 signal:0
prog.cpp: In function ‘int main()’:
prog.cpp:14:6: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]
  ptr = &var1;
      ^
prog.cpp:17:6: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]
  ptr = &var2;


Почему? Я с указателями столкнулся впервые, и немного путаюсь, хотя для чего они нужны понимаю.
Ведь здесь всё, казалось бы просто.

В исходном вариант:
Указателю int присваивается значение адресса переменной var1, а затем var2 по ссылке. Тут всё понятно!
В моём проверочном варианте:
Переменной int присваивается значение адресса переменной var1, а затем var2 по ссылке.

Это мысли вслух. Ошбика в чём? Я так понимаю значение адресса в 16-системе, а переменная типа int. Поэтому компилятор ругается на то, что типа ошибка в переводе int to int.
PM MAIL   Вверх
vinter
Дата 15.2.2014, 11:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



C++ типо-безопасный язык, а следовательно ты не можешь просто присвоить указатель переменной неявно. Чтобы это осуществить, ты должен выразить свои намерения явно:
Код

int ptr;
...
ptr = reinterpret_cast<int>(&var1);



--------------------
Мой блог
PM MAIL WWW   Вверх
borisbn
Дата 15.2.2014, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(hoz @  15.2.2014,  10:33 Найти цитируемый пост)
Поэтому компилятор ругается на то, что типа ошибка в переводе int to int. 

Нет. Перевод не из int в int. Компилятор же чётко говорит, что ему не нравится:
Цитата(hoz @  15.2.2014,  10:33 Найти цитируемый пост)
error: invalid conversion from ‘int*’ to ‘int’


И ещё. Учти, что в варианте vinter'а на 64-х разрядной системе (и, соответственно, 64-х битном компиляторе) в переменную типа int попадёт не весь адрес


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
hoz
Дата 16.2.2014, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(borisbn @  15.2.2014,  14:48 Найти цитируемый пост)
И ещё. Учти, что в варианте vinter'а на 64-х разрядной системе (и, соответственно, 64-х битном компиляторе) в переменную типа int попадёт не весь адрес

Так а как тогда быть? Получается что компилировать нужно код не просто так, а ещё учитывать разрядность системы smile 
Т.е. если я пишу программу, то нужно знать на какой системе я буду её компилировать?
PM MAIL   Вверх
vinter
Дата 17.2.2014, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(hoz @  16.2.2014,  22:21 Найти цитируемый пост)
Т.е. если я пишу программу, то нужно знать на какой системе я буду её компилировать?

для твоего случая есть специальный тип(псевдоним) ptrdiff_t, который имеет размерность указателя на целевой платформе.


--------------------
Мой блог
PM MAIL WWW   Вверх
borisbn
Дата 17.2.2014, 08:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



hoz, я программирую уже лет 20 и я долго пытался вспомнить случай, когда мне нужно было проделывать такого рода трюки - и... не вспомнил. В С++ почти для каждого случая есть свой тип. Для адреса - указатель, для значения - int, double и т.п.
В общем, вывод такой: в целях изучения можно поиграться с указателями, присваивая их в int и обратно. В "боевой" программе этого делать категорически не рекомендуется.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.