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

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

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

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

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

Как лучше копировать память, обмениваться указателями и т.д. при работе с кучей динамических библиотек (DLL) ? - C++
Привет! Вот есть много DLL-к, каждая работает со своей внутренней динамической памятью, а так же есть необходимость работать с объектами...

как избавиться от присваивания процессорного времени переменной при работе циклов? - C++
#include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include &lt;Windows.h&gt; using namespace std; int n; ...

Что не так при работе с указателями? - C++
Здравствуйте! Начинаю изучать работу с указателями. #include &lt;iostream&gt; using namespace std; int fun(int a, int b, long...

Помогите найти ошибку в коде при работе с указателями - C++
Блин, я когда нибудь пойму эти указатели!!???? Подскажите где ошибся? #include&lt;iostream&gt; using namespace std; int foo(int&amp;num); ...

MSVS ошибка setlocale при работе с указателями на массивы - C++
Ниже код, пытаюсь нарисовать умножение матриц. До самого умножения еще не дошел, пока только на заполнении матриц и вывод их на экран....

Исправить ошибку компиляции C2371 при работе с указателями - C++
Привет :) Проходу тему &quot;Указатели&quot;, написал программу. Компилятор ругается, не знаю почему. Сделал всё так как написано в примере....

4
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
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. Кто придумывает такие странные задания?
1
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];
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
01.07.2016, 14:17 #4
Цитата Сообщение от kquick Посмотреть сообщение
Просто меня мучает когда что-то нельзя сделать до конца.
Тут все сделано до конца.
Тебе осталось только понять, что то, чего ты пытаешься сотворить - бессмысленно, ибо противоречит решаемой задаче.
Здесь нет ни нелогичности, ни незаконченности. Изучай дальше язык, и ты поймешь. На основе обрывочных представлений нельзя сделать целостные выводы.
1
_Ivana
3178 / 1794 / 153
Регистрация: 01.03.2013
Сообщений: 5,007
Записей в блоге: 2
01.07.2016, 14:24 #5
Цитата Сообщение от kquick Посмотреть сообщение
Но вот так лучше:
Потому что это моноед с нулем в качестве нейтрального элемента, поэтому и возникает волшебное ощущение "до конца". С указателями тоже все уже "до конца", как сказали выше.
1
01.07.2016, 14:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2016, 14:24
Привет! Вот еще темы с ответами:

При работе с указателями на сервер отправляется мусор, но выводит в консоль норм данные - C++
День добрый! Отправляю на сервер разные штуки и на снифер это ловлю, вот что получается: char buf = &quot;AAABBB&quot;; на снифере AAABBB -...

Пояснить по работе с указателями - C++
Здравствуйте! волнует вопрос об указателях: 1) указатель на переменную используется для ускорения выполнения программы, заменяя...

Как избавиться от мерцания при выводе массива? - C++
вообщем есть массив 20x50. и его нужно часто выводит на консоль и происходит мерцание. что можно сделать чтоб его не было?

Как избавиться от экспоненциального вида при выводе числа - C++
Вот программа, которая вычисляет факториалы чисел от 0 до 20. Факториал для чисел от 10 до 20 представляется в экспоненциальной форме. Как...


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

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

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