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

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

Войти
Регистрация
Восстановить пароль
 
kquick
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 102
#1

Как избавиться от * и . при работе с указателями? - C++

01.07.2016, 13:44. Просмотров 170. Ответов 4
Метки нет (Все метки)

Сразу приведу пример:
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
 
struct struct5 {
    int* value;
};
 
struct struct4 {
    struct5* s5;
};
 
struct struct3 {
    struct4* s4;
};
 
struct struct2 {
    struct3* s3;
};
 
struct struct1 {
    struct2* s2;
};
 
int main() {
    int a, b;
    struct1* s1;
 
    s1 = new struct1;
    s1->s2 = new struct2;
    s1->s2->s3 = new struct3;
    s1->s2->s3->s4 = new struct4;
    s1->s2->s3->s4->s5 = new struct5;
    s1->s2->s3->s4->s5->value = new int;
 
    a = 1;
    *s1->s2->s3->s4->s5->value = a;
    b = *(*(*(*(*(*s1).s2).s3).s4).s5).value;
    printf("a = %d, b = %d\n", a, b);
 
    a = 2;
    *s1->s2->s3->s4->s5->value = a;
    b = *(*(*(*(*s1).s2).s3).s4).s5->value;
    printf("a = %d, b = %d\n", a, b);
 
    a = 3;
    *s1->s2->s3->s4->s5->value = a;
    b = *(*(*(*s1).s2).s3).s4->s5->value;
    printf("a = %d, b = %d\n", a, b);
 
    a = 4;
    *s1->s2->s3->s4->s5->value = a;
    b = *(*(*s1).s2).s3->s4->s5->value;
    printf("a = %d, b = %d\n", a, b);
 
    a = 5;
    *s1->s2->s3->s4->s5->value = a;
    b = *(*s1).s2->s3->s4->s5->value;
    printf("a = %d, b = %d\n", a, b);
 
    a = 6;
    *s1->s2->s3->s4->s5->value = a;
    b = *s1->s2->s3->s4->s5->value;
    printf("a = %d, b = %d\n", a, b);
 
    a = 7;
    *s1->s2->s3->s4->s5->value = a;
    b = ???;
    printf("a = %d, b = %d\n", a, b);
 
    delete s1->s2->s3->s4->s5->value;
    delete s1->s2->s3->s4->s5;
    delete s1->s2->s3->s4;
    delete s1->s2->s3;
    delete s1->s2;
    delete s1;
}


Здесь идет последовательное избавление от * и . в ходе присваивания переменной b от шага 1 к шагу 6. Есть варианты как выполнить наконец и седьмой шаг, то есть избавиться от последней * в присвоении переменной b, не меняя структуры struct1, struct2, ..., strunct5 и типы переменных a, b, s1, s2, ..., s5? Желательно без введения дополнительных переменных.

Хочется написать что-то вроде, но ни как:
C++
1
b = ->s1->s2->s3->s4->s5;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2016, 13:44     Как избавиться от * и . при работе с указателями?
Посмотрите здесь:

Как избавиться от экспоненциального вида при выводе числа C++
Как использовать указатели при работе с массивами? C++
Повреждена куча при работе с динам. памятью. Почему? Как исправить? C++
Как перехватывать события JavaScript при работе Internet Explorer (на С++) C++
Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? C++
как избавиться от присваивания процессорного времени переменной при работе циклов? C++
Как лучше копировать память, обмениваться указателями и т.д. при работе с кучей динамических библиотек (DLL) ? C++
День добрый! Как устроен стек при работе программ ? Правильно ли я понимаю? C++
C++ Пояснить по работе с указателями
Почему выдает ошибку при работе с большим файлом, напишите как исправить ? C++
C++ Помогите найти ошибку в коде при работе с указателями
Что не так при работе с указателями? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
01.07.2016, 13:53     Как избавиться от * и . при работе с указателями? #2
Цитата Сообщение от kquick Посмотреть сообщение
Есть варианты как выполнить наконец и седьмой шаг, то есть избавиться от последней * в присвоении переменной b, не меняя структуры struct1, struct2, ..., strunct5 и типы переменных a, b, s1, s2, ..., s5. Желательно без введения дополнительных переменных.
Никак ты не избавишься.
У тебя присвоение идет значения, а в структуре указатель (на int). Чтобы получить значение для присовения b, нужно указатель разыменовать. Единственное что можно сделать, это слегка отсрочить разыменование,
C++
1
2
3
4
    a = 7;
    *s1->s2->s3->s4->s5->value = a;
    int * v = s1->s2->s3->s4->s5->value;
    b = *v;
PS. Кто придумывает такие странные задания?
kquick
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 102
01.07.2016, 14:01  [ТС]     Как избавиться от * и . при работе с указателями? #3
Цитата Сообщение от DrOffset Посмотреть сообщение
Кто придумывает такие странные задания?
Я придумываю. Просто меня мучает когда что-то нельзя сделать до конца. Это как в циклах можно записать:

C++
1
2
3
int sum = array[0];
for(int i = 1; i < n; i++)
    sum += array[i];
Но вот так лучше:
C++
1
2
3
int sum = 0;
for(int i = 0; i < n; i++)
    sum += array[i];
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
01.07.2016, 14:17     Как избавиться от * и . при работе с указателями? #4
Цитата Сообщение от kquick Посмотреть сообщение
Просто меня мучает когда что-то нельзя сделать до конца.
Тут все сделано до конца.
Тебе осталось только понять, что то, чего ты пытаешься сотворить - бессмысленно, ибо противоречит решаемой задаче.
Здесь нет ни нелогичности, ни незаконченности. Изучай дальше язык, и ты поймешь. На основе обрывочных представлений нельзя сделать целостные выводы.
_Ivana
2838 / 1663 / 143
Регистрация: 01.03.2013
Сообщений: 4,759
Записей в блоге: 2
01.07.2016, 14:24     Как избавиться от * и . при работе с указателями? #5
Цитата Сообщение от kquick Посмотреть сообщение
Но вот так лучше:
Потому что это моноед с нулем в качестве нейтрального элемента, поэтому и возникает волшебное ощущение "до конца". С указателями тоже все уже "до конца", как сказали выше.
Yandex
Объявления
01.07.2016, 14:24     Как избавиться от * и . при работе с указателями?
Ответ Создать тему
Опции темы

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