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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

Указатель на указатель - разница способов - C++

14.03.2010, 14:18. Просмотров 1168. Ответов 18
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
int a =5;
int *b = &a;
 
 
 
int **e =&b;  //первый способ
//Нужно писать столько * скока указателей..
 
 
int *f = b; //Втрой способ
второй проще..
зачем тогда есть первый?

и как сделать укзатель на указатель на указатель?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2010, 14:18     Указатель на указатель - разница способов
Посмотрите здесь:

Строковый литерал и указатель на строку. В чем разница? - C++
Добрый день. Начал только изучать С++, не могу понять в чем разница между указателем на литерал и указателем на строку??? Заранее...

разница между указатель на функцию и функция возврата указателя? - C++
подскажите пожалуйста очень срочно надо (вопрос на зачет)

Указатель на указатель заполнение матрицы - C++
Помогите как самому вбивать матрицу скоко на скоко и элементы этой матрицы ( без функций ) используя только <iostream>. (помощь)

Указатель на указатель заполнение матрицы - C++
Напишите как самому вбивать матрицу скок на скока и каждый элемент в нем (заранее спасибо)!

выделить место для объекта с помощью new или создать указатель, объект и присвоить один другому. какая разница? - C++
кроме того что к объекту созданному с помощью new можно будет обращаться только через указатель.

Ссылка на указатель на указатель - C++
void TEST( int **&refptr, int const &N); int main() { int const N = 10; int i{ 0 }, b{ 2 }, *ptr{ &i, &b }; ...

Указатель на указатель на функцию - C++
Дан следующий код void f () {} void main() { void (**ppf) (); } Вопрос: какой код следует написать, чтобы...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
14.03.2010, 14:26     Указатель на указатель - разница способов #2
Krist_ALL, "второй способ" это не указатель на указатель, я присвоить значению указателя f значение b

первый способ единственный
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
14.03.2010, 14:43  [ТС]     Указатель на указатель - разница способов #3
C++
1
2
3
4
int **e =&b; //5
 
 
int *f = b; //5
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
15.03.2010, 14:57  [ТС]     Указатель на указатель - разница способов #4
int a = 5;

Первый способ
int *b = &a;
int *c = b;
int *d = c;

ВТорой

int *b = &a;
int **c = &b;
int ***d = &c;

первый ведь удобнее.
и не надо тучу * писать..
или я не прав?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
15.03.2010, 15:11     Указатель на указатель - разница способов #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ты не прав. Это два разных способа, и используются они в разных случаях (конечно же, в твоем случае второй способ не используется, как нерациональный)
Первый способ. Ты объявляешь целую переменную a, потом объявляешь указатель b на целый тип, и инициализируешь его адресом a (с помощью операции взятия адреса). Теперь в переменной b хранится адрес a. Потом ты объявляешь еще один указатель c на целый тип, и инициализируешь его не адресом указателя b, а значением, которое он хранит-адресом а. Остальные указатели объявляются и инициализируются аналогично. Теперь, чтобы получить доступ к значению, которое храниться в a, например, с помощью указателя b, тебе нужно совершить однократную операцию разыменования указателя(например, *b=19 - и в переменной a будет храниться уже значение 19).
Второй способ. c - это уже указатель на указатель на целый тип, и он хранит уже не адрес a, а адрес указателя b. Соответственно, d - это указатель на указатель на указатель на целый тип, и чтобы изменить значение a с помощью указателя d, тебе нужно применить три раза операцию разыменования (***d=19). (*d==c==&b==&&a, **d==b==&a, ***d==a - это для наглядности )
PS. Здесь и ответ на твой вопрос:
Цитата Сообщение от Krist_ALL Посмотреть сообщение
и как сделать укзатель на указатель на указатель?
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
15.03.2010, 15:23  [ТС]     Указатель на указатель - разница способов #6
Это я понимаю)
ав каких случаях первый способ рационален а когда второй.
в каких ситуациях?
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
15.03.2010, 15:26     Указатель на указатель - разница способов #7
Цитата Сообщение от Krist_ALL Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
int a =5;
int *b = &a;
 
 
 
int **e =&b;  //первый способ
//Нужно писать столько * скока указателей..
 
 
int *f = b; //Втрой способ
второй проще..
зачем тогда есть первый?

и как сделать укзатель на указатель на указатель?
Сделай printf ("%d", **e); и printf ("%d", **f);
Увидишь, что второй код - вовсе не то, что ты думал

Добавлено через 1 минуту
Цитата Сообщение от Krist_ALL Посмотреть сообщение
ав каких случаях первый способ рационален а когда второй.
Второго способа нет, потому как он делает совсем не то
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
15.03.2010, 15:27     Указатель на указатель - разница способов #8
Evg, ну я же написал - для наглядности
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
15.03.2010, 15:28     Указатель на указатель - разница способов #9
Цитата Сообщение от Nameless One Посмотреть сообщение
Evg, ну я же написал - для наглядности
Я понял, но не сразу Удалил
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
15.03.2010, 15:44     Указатель на указатель - разница способов #10
Цитата Сообщение от Krist_ALL Посмотреть сообщение
ав каких случаях первый способ рационален а когда второй.
Вопрос не в том, когда рационален один способ, а когда второй. Они используются для разных целей.
Начнем с того, что в C/C++ массивы реализованы с помощью указателей:
C++
1
2
int a[5];//a - указатель на первый элемент массива
         //a+1 - указатель на второй элемент массива и т.д.
Таким образом, записи a[0] и *(a+0), a[4] и *(a+4) - аналогичны. Когда ты используешь многомерные массивы (т.е. с размерностью больше единицы), ты уже используешь указатели на указатели на указатели... К примеру, двумерный массив типа int - это указатель на указатель на тип int.
Без указателей на указатели не обойтись, если ты хочешь динамически выделить память под многомерный массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
int main()
{
    //Выделение памяти под двумерный массив
    int** parr=new int*[2];
    for(size_t i=0; i<2; ++i)
    {
        parr[i]=new int[2];
        for(size_t j=0; j<2; ++j)
            parr[i][j]=i+j;//Доступ по индексу
    }
    for(size_t i=0; i<2; ++i, std::cout << std::endl)
        for(size_t j=0; j<2; ++j)
            std::cout << *(*(parr+i)+j) << " ";//Доступ через операцию разыменования
    //Освобождение памяти
    for(size_t i=0; i<2; ++i)
        delete[] parr[i];
    delete[] parr;
    system("pause");
    return 0;
}
Сначала ты выделяешь память под массив строк, потом для каждой строки ты выделяешь память под массив ее элементов
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.03.2010, 15:57     Указатель на указатель - разница способов #11
Двойной указатель используется для передачи простого указателя по адресу.
Могу не большой пример привести: добавление на вершину стека:
C++
1
2
3
4
5
6
void push(Node **top,int d){
Node *p = new Node;
p->d=d;
p->next=(*top);
(*top)=p;       //в переданном указателе меняется значение: теперь он ссылается на другую память.
}
Здесь передается указатель на вершину стека, его значение(указателя) меняется в этой функции.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
15.03.2010, 16:06     Указатель на указатель - разница способов #12
Genius Ignat, пример, конечно, наглядный, но что нам мешает передавать не адрес указателя, а сам указатель, и не применять лишних операций разыменования?
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
15.03.2010, 17:14  [ТС]     Указатель на указатель - разница способов #13
а как передавать не адрес указателя, а сам указатель?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
15.03.2010, 17:18     Указатель на указатель - разница способов #14
C++
1
2
3
4
5
6
void push(Node *top,int d){
Node *p = new Node;
p->d=d;
p->next=top;
top=p;       
}
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
15.03.2010, 18:02     Указатель на указатель - разница способов #15
Цитата Сообщение от Krist_ALL Посмотреть сообщение
а как передавать не адрес указателя, а сам указатель?
C
1
2
3
4
5
6
7
8
9
10
11
/* Передача указателя */
extern void func (int *p);
...
int *ptr;
func (ptr);
 
/* Передача адреса указателя */
extern void func (int **p);
...
int *ptr;
func (&ptr);
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.03.2010, 21:11     Указатель на указатель - разница способов #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Nameless One:
Ты ошибаешься, это уже не добавление на вершину стека.
Так как указатель вершины не изменит своего значения.
В этом примере ты не управляешь указателем вершины стека.

Ты просто берешь адрес из одного указателя и записываешь его в другой.

C++
1
2
3
4
5
6
void push(Node *top,int d){
Node *p = new Node;
p->d=d;
p->next=top;
top=p;       
}
Вот теперь попробуй сделать так, если ты не понял:

C++
1
2
3
4
5
6
7
8
//От этой функции толку не будет память будет выделена в локальный указатель.
void my_new(int *p){
p = new int;           //бестолковая утечка памяти, даже эту память клиент использовать не может.
}
//Пример её использования.
int *pa;
my_new(pa);
*pa=10;      //ошибка времени. памяти то нет

Вот правильная вариация:
C++
1
2
3
4
5
6
7
8
void my_new(int **p){
*p = new int;         
}
//Пример её использования.
int *pa;
my_new(&pa);
*pa=10;        //обращаемся к выделенной памяти.
delete pa;     //можно и освободить.
Автор зайди сюда, там интересное,
Бесконечность и далее...

после увиденного просьба не задавать вопросы.

Добавлено через 10 минут
Указатель на указатель - разница способов
Тема странно как то называется...

Добавлено через 15 минут
Nameless One:
Дам тебе один совет, который дал мне один мой друг:
Прежде чем что то говорить нужно быть уверенным что это истина,
если ты не уверен посмотри в литературу.
Это я говорю к тому что бы ты не вводил в заблуждения людей,
которые только познают программирование.

Надеюсь ты извлечешь пользу из этого высказывания.
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.03.2010, 05:33     Указатель на указатель - разница способов #17
Цитата Сообщение от Krist_ALL
ав каких случаях первый способ рационален а когда второй.
в каких ситуациях?
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
    int a = 5;
 
    int *p;
    int **pp;
 
    /* переменная-указатель p может хранить адрес переменной a */
    /* переменная-указатель pp может хранить адрес переменной p */
 
    /* переменная-указатель p не может хранить адрес переменной pp */
    /* переменная-указатель pp не может хранить адрес переменной a */
 
 
    int *ptrarr[5];
    int i;
 
    p = &a;
 
    for (i = 0; i < 5; i++)
        ptrarr[i] = p;
 
    pp = ptrarr;
 
    /* мы можем перемещать указатель pp по массиву указателей ptrarr */
 
    for (i = 0; i < 5; i++) {
        printf("%d" "\n", **pp);
        pp++;
    }
argv устроен именно так
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.03.2010, 06:00     Указатель на указатель - разница способов #18
Цитата Сообщение от Krist_ALL Посмотреть сообщение
int *f = b; //Втрой способ
. Копия указателя, а не указатель на указатель. То есть это ещё один указатель на а.

Добавлено через 1 минуту
Цитата Сообщение от Nameless One Посмотреть сообщение
его не адресом указателя b, а значением
. Вот именно. Так куда указатель?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2010, 09:59     Указатель на указатель - разница способов
Еще ссылки по теме:

Освободить указатель на указатель - C++
class Interface { }; class Test : public Interface { }; void main() { Interface** s = new Interface*; for (int i =...

Про указатель *, указатель на указатель **, и про new - C++
#include &quot;stdafx.h&quot; class neuro { public: double *inputs; int inputs_count; neuro(int uc, double ii ) { ...

Указатель - C++
unsigned short b=0xffff; char *a=malloc(65536); for(int i=0;i&lt;65536;i+=2) { *(a+i)=b; } free(a); Добрый день! ...

указатель - C++
ввод: (1&lt;=n&lt;=100) вводим n вывод: Сумма элементов до максимума... Input Output 8 1 9 1 -1 -1 9 1 1 0

Указатель на указатель - C++
Добрый день! Читал про многоуровневую адресацию, но не понял одну штуку. Когда мы пользуемся функцией printf(), то можем написать код...


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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
16.03.2010, 09:59     Указатель на указатель - разница способов #19
Genius Ignat, Спасибо, я понял свою ошибку
Yandex
Объявления
16.03.2010, 09:59     Указатель на указатель - разница способов
Ответ Создать тему
Опции темы

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