Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
1

Передача двойного указателя

09.01.2011, 14:06. Просмотров 2647. Ответов 5
Метки нет (Все метки)

Написал прогу которая работает с односвязным списком.
При передаче в функцию двойного указателя, я его теряю. Смотрел в дебаггером - значение внутри функции совсем другое. Пробовал другой компилятор, тоже самое
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
#include <stdlib.h>
 
struct List
{
    int data;
    struct List* next;
};
 
List** Init (int data)
{
    List* tmp = (List*)malloc(sizeof(List));
    tmp->data = data;
    tmp->next = NULL;
    return &tmp;
}
 
List* Add (List** tail, int data)
{
    List* tmp = (List*)malloc(sizeof(List));
    tmp->data = data;
    tmp->next = NULL;
    (*tail)->next = tmp;
    *tail = tmp;
    return tmp;
}
 
List* GetPrev (List** head, List* item)
{
    List* tmp = *head;
    if (item == tmp)
        return NULL;
    while (tmp->next!=item)
        tmp = tmp->next;
    return tmp;
}
 
void Delete (List** head, List** tail, List* item)
{
    if (item == *head)
    {
        *head = item->next;
        free (item);
    }
    else if (item->next == NULL)
    {
        List* tmp = GetPrev(head, item);
        tmp->next = NULL;
        *tail = tmp;
        free (item);
    }
    else
    {
        List* tmp = item->next;
        item->data = tmp->data;
        item->next = tmp->next;
        free(tmp);
    }
    return;
}
 
void Print (List** head)
{
    List* count = *head;
    while (count->next != NULL)
    {
        printf ("%d->", count->data);
        count = count->next;
    }
    printf ("%d\n", count->data);
}
 
int main()
{
    List** head, **tail;
    List* ToDel;
    head = tail = Init (4);
    Add (tail, 3);
    ToDel = Add(tail, -1);
    Add(tail, 7);
    Print (head);
    Delete(head, tail, ToDel);
    Print (tail);
    return 0;
}
Добавлено через 11 минут
спасибо, разобрался:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <stdlib.h>
 
struct List
{
    int data;
    struct List* next;
};
 
List* Init (int data)
{
    List* tmp = (List*)malloc(sizeof(List));
    tmp->data = data;
    tmp->next = NULL;
    return tmp;
}
 
List* Add (List** tail, int data)
{
    List* tmp = (List*)malloc(sizeof(List));
    tmp->data = data;
    tmp->next = NULL;
    (*tail)->next = tmp;
    *tail = tmp;
    return tmp;
}
 
List* GetPrev (List** head, List* item)
{
    List* tmp = *head;
    if (item == tmp)
        return NULL;
    while (tmp->next!=item)
        tmp = tmp->next;
    return tmp;
}
 
void Delete (List** head, List** tail, List* item)
{
    if (item == *head)
    {
        *head = item->next;
        free (item);
    }
    else if (item->next == NULL)
    {
        List* tmp = GetPrev(head, item);
        tmp->next = NULL;
        *tail = tmp;
        free (item);
    }
    else
    {
        List* tmp = item->next;
        item->data = tmp->data;
        item->next = tmp->next;
        if (tmp->next == NULL)
            *tail = item;
        free(tmp);
    }
    return;
}
 
void Print (List** head)
{
    List* count = *head;
    while (count->next != NULL)
    {
        printf ("%d->", count->data);
        count = count->next;
    }
    printf ("%d\n", count->data);
}
 
int main()
{
    List* head, *tail;
    List* ToDel;
    head = tail = Init (4);
    Add (&tail, 3);
    ToDel = Add(&tail, -1);
    Add(&tail, 7);
    Print (&head);
    Delete(&head, &tail, ToDel);
    Print (&head);
    return 0;
}
но ответ почему не работал первый вариант хочу услышать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2011, 14:06
Ответы с готовыми решениями:

Передача анонимного двойного указателя в функцию
Создаю SNDFILE **outfile1=new SNDFILE*; priemnik(??? **outfile1) Это всё в main ...

Вызов методов класса из двойного указателя на экземпляр класса
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct...

Передача указателя
Здравствуйте! Форумчане, очень нужна помощь..:cry: В общем ситуация такова: написана программа,...

передача указателя
какой способ передачи указателя наиболее быстрый? int a = 1; int *b= &amp;a;...

5
189 / 173 / 12
Регистрация: 04.09.2010
Сообщений: 656
09.01.2011, 14:41 2
C++
1
2
3
4
5
6
7
List** Init (int data)
{
        List* tmp = (List*)malloc(sizeof(List)); // переменная tmp является локальной и будет уничтожена при выходе из функции
        tmp->data = data;
        tmp->next = NULL;
        return &tmp; // вы возвращаете адрес локальной переменной
}
у вас указатель - локальная переменная и вы возвращаете адрес локальной переменной, которая уничтожается при выходе за пределы функции
1
598 / 566 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.01.2011, 14:46 3
потому что возвращать нужно адрес, а не ссылку на локальную переменную
0
Evg
Эксперт CАвтор FAQ
21146 / 8162 / 628
Регистрация: 30.03.2009
Сообщений: 22,463
Записей в блоге: 30
09.01.2011, 15:05 4
Цитата Сообщение от panicwassano Посмотреть сообщение
потому что возвращать нужно адрес, а не ссылку на локальную переменную
А по твоему, что в указанном примере возвращается?
0
598 / 566 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.01.2011, 15:10 5
Evg вот до
C++
1
2
3
4
5
6
7
List** Init (int data)
{
        List* tmp = (List*)malloc(sizeof(List));
        tmp->data = data;
        tmp->next = NULL;
        return &tmp;
}
вот после
C++
1
2
3
4
5
6
7
List* Init (int data)
{
        List* tmp = (List*)malloc(sizeof(List));
        tmp->data = data;
        tmp->next = NULL;
        return tmp;
}
0
Evg
Эксперт CАвтор FAQ
21146 / 8162 / 628
Регистрация: 30.03.2009
Сообщений: 22,463
Записей в блоге: 30
09.01.2011, 15:18 6
panicwassano, ты утверждал, что надо передавать указатель, а не ссылку. Где тут, по твоему, указатель, а где ссылка?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2011, 15:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Передача указателя функции
Друзья! Need help! Есть пример &quot;Переменный список параметров указателей&quot;. В функции подсчитываем...

Передача указателя в структуру
Не получается передать указатель на память в структуру. Посылаю state.knob.phase, его...

Передача указателя в функцию
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять,...

передача указателя на функцию
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate:...


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

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

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