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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
#1

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

09.01.2011, 14:06. Просмотров 1181. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2011, 14:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача двойного указателя (C++):

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

Вызов методов класса из двойного указателя на экземпляр класса - C++
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct Point { void getPoint(){}; ...

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

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

Передача указателя в функцию - C++
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете пропустить. Задали на лабе сделать некий...

Передача указателя функции - C++
Помогите пожалуйста исправить код а то я в указатели ваще не втыкаю /* Вывести на экран три n-мерных вектора */ ...

5
vx5
187 / 171 / 4
Регистрация: 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
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
09.01.2011, 14:46 #3
потому что возвращать нужно адрес, а не ссылку на локальную переменную
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,211
Записей в блоге: 27
09.01.2011, 15:05 #4
Цитата Сообщение от panicwassano Посмотреть сообщение
потому что возвращать нужно адрес, а не ссылку на локальную переменную
А по твоему, что в указанном примере возвращается?
0
panicwassano
592 / 560 / 20
Регистрация: 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
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,211
Записей в блоге: 27
09.01.2011, 15:18 #6
panicwassano, ты утверждал, что надо передавать указатель, а не ссылку. Где тут, по твоему, указатель, а где ссылка?
1
09.01.2011, 15:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2011, 15:18
Привет! Вот еще темы с ответами:

Передача указателя на функцию - C++
Доброго дня Форумчане. Хотелось бы узнать как вызывать функцию получив на нее указатель? пример class C1 { public: void...

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

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

Передача указателя по ссылке - C++
Так печатается &quot;12&quot; #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; void somefunction(int*&amp;); int...


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

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

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