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

Указатели и ссылки - C++

Восстановить пароль Регистрация
 
RioSteyn
0 / 0 / 0
Регистрация: 23.05.2013
Сообщений: 5
22.06.2013, 22:59     Указатели и ссылки #1
Собственно, не могу до конца осознать как это работает, вот пример из вики(комменты входят в пример)
C++
1
2
3
4
5
6
7
int  n  = 6;    // Объявление переменной n типа int и присваивание ей значения 6
int *pn = malloc( sizeof ( int ) ); // Объявления указателя pn и выделение под него памяти.
    *pn = 5;    // Разыменование указателя и присваивание значения 5.
     n = *pn;   // Присвоить n то значение (5), на которое указывает pn.
     free(pn);  // Освободить занятую память.
     pn = &n;   // Присваивает указателю pn адрес переменной n(указатель будет ссылаться на n).
     n = 7;     // *pn тоже стало равно 7
я проанализировал пример и и понял следующее:
1) при обьявлении переменной так (int x = 5 я присваиваю переменной х адрес на ячейку памяти со значением 5, который(адрес всмысле) уже никак не изменится. Вот напишу я потом (cout << &x и получу этот адрес, а теперь вопрос - почему, если я напишу (cout <<*x, мне выдаст ошибку. поидее я говорю "Выведи-ка мне значение из ячейки по адресу х" так почему не выводит?

2)при обьявлении переменной указателя т.е. так (int *x = new int) у меня, кстати, если использовать malloc, как в вики, не работает почему-то, ну да неважно). Я выделяю ячейку памяти для хранения типа данных инт и могу эту память очищать или создавать другие переменные с помощью указателей, которые будут ссылаться на эту ячейку, правильно?

Вобщем, я надеюсь, что вы, Уважаемые, скажете мне, что я не так понимаю в 1 случае и скажете, правильно ли я понял второй случай.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
23.06.2013, 00:18     Указатели и ссылки #2
Переменная x создается компилятором на стеке и уничтожается по выходу из блока. Это может быть закрывающаяся скобка функции, либо конструкция вида
C++
1
2
{
}
Звездочка применима к указателям, да и если бы Вы так написали с cout, то это было бы разыменование указателя, т.е. вывелось бы само значение в ячейке памяти. Но в данном случае к стековой переменной x звездочка неприменима.

По второму:
C++
1
int *x = new int;
C помощью new выделяем память в куче и указателю (теперь уже x) передаем адрес выделенной памяти. По этому адресу можно записать значение, например.
создавать другие переменные с помощью указателей
Это не совсем ясно для меня. Вы можете либо присваивать адрес только выделенного участка памяти (с помощью new или аналогов), либо просто адрес переменной, которая когда-то раньше была создана, либо c указателя:
C++
1
2
3
int x = 10;
int *p1 = &x;
int *p2 = p1; // оба указывают на x
Добавлено через 2 минуты
Можно конечно на выделять кучу участков памяти, присваивая лишь одному указателю все адреса по очереди. Но так каждый раз присваивая очередной адрес, мы будем терять предыдущие (если конечно память не освобождать), а это утечка.

C++
1
2
3
int *p1 = new int; //утерян
    p1 = new int; // утерян
    p1 = new int;
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
23.06.2013, 01:08     Указатели и ссылки #3
Цитата Сообщение от RioSteyn Посмотреть сообщение
а теперь вопрос - почему, если я напишу (cout <<*x, мне выдаст ошибку.
x это не указатель, а имя переменной. При помощи & оператора взятия адреса можно получить адрес, но разыменовывать нужно тоже адрес, а не имя переменной. Вот так например можно:
C++
1
2
int x=123;
cout<<*(&x)<<endl;
RioSteyn
0 / 0 / 0
Регистрация: 23.05.2013
Сообщений: 5
23.06.2013, 12:53  [ТС]     Указатели и ссылки #4
Спасибо, теперь стало яснее)
Yandex
Объявления
23.06.2013, 12:53     Указатели и ссылки
Ответ Создать тему
Опции темы

Текущее время: 12:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru