1 / 1 / 3
Регистрация: 20.01.2014
Сообщений: 91
1

Объясните как происходит инициализация данного указателя

10.05.2016, 04:05. Показов 1390. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро. Объясните понятным языком по этапно, как происходит инициализация указателя на указатель в той строчке (тему про указатели разбирал).
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main( void ) {
double **p = 0;
*( *( p = new double* ) = new double ) = 2; //Вот эта строчка
cout << **p << endl;
delete *p;
delete p;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2016, 04:05
Ответы с готовыми решениями:

Как происходит передача указателя в/из функции
Здравствуйте. Не могу понять некоторые моменты. Как происходит передача указателя в функцию? В...

Обьявление и инициализация переменных в цикле: как это работает (что там происходит)?
Здравствуйте! Можете помочь понять обьявление переменных Вот код: #include &lt;iostream&gt;...

Объясните, как происходит создание объекта
Объясните мне идиоту вот например я создаю объект cat Pawel = new cat(); здесь слева создается...

инициализация указателя
class Item { public: Item() { num0=new char(&quot;как&quot;);//ошибка cannot convert from 'const...

9
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.05.2016, 06:24 2
Лучший ответ Сообщение было отмечено Сарсен как решение

Решение

Цитата Сообщение от Сарсен Посмотреть сообщение
p = new double*
Указателю на указатель p присвоили адрес указателя на double,
Цитата Сообщение от Сарсен Посмотреть сообщение
*( p = new double* ) = new double
Разыменовали указатель на указатель, получили просто указатель на double, присвоили этому указателю адрес переменной типа double.
Цитата Сообщение от Сарсен Посмотреть сообщение
*( *( p = new double* ) = new double ) = 2
Разыменовали указатель на double, получили переменную типа double, присвоили этой переменной значение 2.

Добавлено через 10 минут
То же самое:
C++
1
2
3
    double **p = new double*;
    *p = new double;
    **p = 2;
1
1 / 1 / 3
Регистрация: 20.01.2014
Сообщений: 91
10.05.2016, 07:33  [ТС] 3
Почему же нельзя сделать таким образом:
C++
1
2
3
4
int i, j, k;
i = &j;
j = &k;
k = 10;
Разве i не будет указатель на указатель? В чем же отличие от:
C++
1
int** i;
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.05.2016, 07:53 4
Цитата Сообщение от Сарсен Посмотреть сообщение
Разве i не будет указатель на указатель?
Пишешь, что:
Цитата Сообщение от Сарсен Посмотреть сообщение
тему про указатели разбирал
В теме не написано, как указатели объявляются?

Добавлено через 9 минут
Указатель - это объект, который хранит адрес (значение указателя - адрес). Указатель на указатель - это объект, который хранит адрес другого указателя (значение указателя на указатель - адрес другого указателя).
C++
1
2
3
4
5
int* p; // объявление указателя на int
int j = 4;
p = &j; // указателю присвоен адрес переменной j
int** pp; // объявление указателя на указатель на int
pp = &p; // указателю на указатель на int присвоен адрес указателя на int
1
1 / 1 / 3
Регистрация: 20.01.2014
Сообщений: 91
10.05.2016, 08:05  [ТС] 5
Указатели я понимаю что такое, однако некоторые вещи не укладываются в голове. Допустим почему нужно использовать указатели при выделении памяти из кучи. Что изменится если использовать переменную вместо указателя. И обращаться к этой переменной по имени. Зачем вообще нужно хранить адрес переменной в указателе?, если у каждой переменной есть свое имя, и по ней можно быстро найти значение.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.05.2016, 08:24 6
Цитата Сообщение от Сарсен Посмотреть сообщение
Допустим почему нужно использовать указатели при выделении памяти из кучи.
Потому, что при этом возвращается адрес начала выделенной памяти, и только через этот адрес (имени там никакого нет) можно получить доступ к выделенной памяти.
1
1 / 1 / 3
Регистрация: 20.01.2014
Сообщений: 91
10.05.2016, 08:53  [ТС] 7
Допустим сохраним адрес в переменную, который вернет оператор new. Разве не получится получить доступ к значениям находящимся в этой памяти через имя переменной(не используя указатель)?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.05.2016, 19:44 8
Цитата Сообщение от Сарсен Посмотреть сообщение
(не используя указатель)
Даже если компилятор это позволит, то всё равно придётся явно приводить эту переменную к указателю, чтобы можно было использовать значение этой переменной как адрес, а не как просто число.
C++
1
2
3
4
5
    unsigned int i = 0;
    i = (unsigned int)new int(4); // сохранили адрес как число
    cout << *((int*)i) << endl;
    *((int*)i) = 5;
    cout << *((int*)i) << endl;
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
10.05.2016, 21:25 9
Сужающее преобразование.

new возвращает указатель на какой-то адрес, адрес - это не десятичное число!

Цитата Сообщение от Сарсен Посмотреть сообщение
Допустим сохраним адрес в переменную, который вернет оператор new
Каша.

Мы не можем сохранить что-то во что-то возвращённое. new возвращает указатель.

То, что возвращено, то, после момента возвращения себя из, уже не переменная!
1
1 / 1 / 3
Регистрация: 20.01.2014
Сообщений: 91
10.05.2016, 21:56  [ТС] 10
Цитата Сообщение от nd2 Посмотреть сообщение
Даже если компилятор это позволит, то всё равно придётся явно приводить эту переменную к указателю
Все, разобрался, спасибо.
0
10.05.2016, 21:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2016, 21:56
Помогаю со студенческими работами здесь

Инициализация указателя
Написал такой код: #include &lt;iostream&gt; using namespace std; int main() { int n=10;...

Объясните, пожалуйста, как происходит сортировка на строках
Всем доброго вечера! Объясните доступным языком каким образом строки сортируют массив, я...

Объясните, как происходит появление горизонтального скролла?
При увеличении масштаба, на нормальных сайтах(даже здесь) снизу появляется горизонтальный скролл и...

Инициализация указателя с malloc ?
Я тут прочитал про malloc, верно ли я понял? Есть: char* pszBuffer; Выходит лучше сделать...

Инициализация указателя в функции
не понимаю... main.cpp somestruct *v = 0; int main() { init(v);

Инициализация указателя в классе
Есть класс const int NoL = 0; class A{ private: int&amp; IF; A(){IF = NoL; }; } на что...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru