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

Указатели и ссылки. Помогите разобраться с синтаксисом - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Построить граф http://www.cyberforum.ru/cpp-beginners/thread374205.html
можете привести простейший пример проги которая выдаёт граф просто чертёж?
C++ Работа с class-ами(вывести на дисплей) создать вектор из фигур и вывести их на печать с помощью класса GROUP_OBJECT что уже реализовано #include <iostream> #include <string.h> #include <vector> using namespace std; class ELLEMENTS{ // Базовый класс... http://www.cyberforum.ru/cpp-beginners/thread374198.html
C++ Приложение для кассы обмена валюты vs 2010
Приложение для кассы обмена валюты. Исходное значение (доллары или рубли) вводится в текстовое поле (TextBox). Курс доллара задан в программе и показывается в надписи (Label). Должен быть предусмотрен выбор типа перевода: доллары в рубли или наоборот с помощью какого-либо компонента, например RadioButton. Результат выводится в надписи (Label). При запуске программа дополнительно должна...
Переставить строки и столбцы матрицы чтобы максимальный по модулю элемент был расположен на пересечении К - той строки и К - того столбца. C++
Дана матрица А(nxn). Найти максимальный по модулю элемент матрицы. Переставить строки и столбцы матрицы таким образом, чтобы максимальный по модулю элемент матрицы был расположен на пересечении К - той строки и К - того столбца. Добавлено через 1 час 10 минут Построить надо в С++ю помогите пожалуйста завтра сдать уже надо задачую
C++ Сортировка массива структур по выбранному полю с помощью алгоритма std::sort http://www.cyberforum.ru/cpp-beginners/thread374183.html
Не знаю, как правильно передать функцию сравнения в std::sort. Кроме того в моей структуре есть поля одного типа, мне кажется будет не правильно писать одинаковые функции сравнения для каждого поля. Вот структура моей программы: struct HOUSE{ string street; string number; string num_floors; string num_apartment; int num_residents;
C++ сортировка слиянием Доброго времени суток, помогите пожалуйста с сортировкой слиянием... дело в том что нужно сделать её через вектор.. помогите кто чем может! подробнее

Показать сообщение отдельно
Кгин
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 25
28.10.2011, 22:06     Указатели и ссылки. Помогите разобраться с синтаксисом
Всем добрый вечер. Знаю, что тема поднималась не раз, много здесь уже таких нашел и перечитал, но ни как че та до меня не дойдет. В трех книгах прочитал эту тему, да что-то все вокруг да около...

Сама ситуация: Решил разобраться с ссылками и указателями до основания. С ссылками вроде все прокатило, а вот с указателями ну ни как. Сделал такую программку (смысл: считает сколько раз срабатывает событие OnTimer и выводит в Label, а на пятый раз останавливает таймер.

Вот через ссылки:

*.h
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
//---------------------------------------------------------------------------
 
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TFMain : public TForm
{
__published:    // IDE-managed Components
    TTimer *Timer1;
    TLabel *Lab;
    void __fastcall Timer1Timer(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TFMain(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFMain *FMain;
//---------------------------------------------------------------------------
void func (int &S);
int A = 0;
#endif
*.cpp
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFMain *FMain;
//---------------------------------------------------------------------------
__fastcall TFMain::TFMain(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void func (int &S) {
    switch (S) {
        case 0 : {
            FMain->Lab->Caption = S;
            S++;
            break;
        }
        case 1 : {
            FMain->Lab->Caption = S;
            S++;
            break;
        }
        case 2 : {
            FMain->Lab->Caption = S;
            S++;
            break;
        }
        case 3 : {
            FMain->Lab->Caption = S;
            S++;
            break;
        }
        case 4 : {
            FMain->Lab->Caption = S;
            S++;
            break;
        }
        case 5 : {
            FMain->Lab->Caption = S;
            FMain->Timer1->Interval = 0;
            break;
        }
 
    default:
        ;
    }
 
}
Все отлично работает, но как только я начинаю использовать указатели, ошибка:

C++
1
2
3
4
5
6
[BCC32 Error] Main.cpp(60): E2034 Cannot convert 'int' to 'int *'
  Full parser context
    Main.cpp(58): parsing: void _fastcall TFMain::Timer1Timer(TObject *)
[BCC32 Error] Main.cpp(60): E2342 Type mismatch in parameter 'S' (wanted 'int *', got 'int')
  Full parser context
    Main.cpp(58): parsing: void _fastcall TFMain::Timer1Timer(TObject *)
Вот ошибочный код:
*.h
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
//---------------------------------------------------------------------------
 
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TFMain : public TForm
{
__published:    // IDE-managed Components
    TTimer *Timer1;
    TLabel *Lab;
    void __fastcall Timer1Timer(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TFMain(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFMain *FMain;
//---------------------------------------------------------------------------
void func (int *S);
int A = 0;
#endif
*.cpp
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFMain *FMain;
//---------------------------------------------------------------------------
__fastcall TFMain::TFMain(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void func (int *S) {
    switch (*S) {
        case 0 : {
            FMain->Lab->Caption = *S;
            *S++;
            break;
        }
        case 1 : {
            FMain->Lab->Caption = *S;
            *S++;
            break;
        }
        case 2 : {
            FMain->Lab->Caption = *S;
            *S++;
            break;
        }
        case 3 : {
            FMain->Lab->Caption = *S;
            *S++;
            break;
        }
        case 4 : {
            FMain->Lab->Caption = *S;
            *S++;
            break;
        }
        case 5 : {
            FMain->Lab->Caption = *S;
            FMain->Timer1->Interval = 0;
            break;
        }
 
    default:
        ;
    }
 
}
Все в голове перемешалось - ничего не могу понять...

Кто-нибудь, будьте любезны, объясните, че ей нада? Как с этими указателями работать?

Добавлено через 1 час 43 минуты
По тихоньку начинаю понимать:

То есть получается при использовании ссылок в как в первом примере, при передаче функции какой-то переменной, функция по ссылке получает участок памяти и работает со значением по этому адресу. По этому значение меняется функцией и изменения доступны за пределами функции.

С указателями немного по другому. При использовании указателей, необходимо, прежде чем передать его функции поместить адрес, который необходимо передать, в переменную, и его уже передавать в вызываемую функцию. Тогда функция получает не содержимое памяти, а адрес, по которому она может получить значение. А чтобы работать непосредственно со значением участка памяти в функции необходимо указатель разыменовать "*" (как бэ сказать функции "возьми значение по адресу") Я все правильно понял?

Немного переделал код и все вроде работает, но почему-то инкремент не повышает значение при работе с разыменованным указателем.

*.h
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
//---------------------------------------------------------------------------
 
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TFMain : public TForm
{
__published:    // IDE-managed Components
    TTimer *Timer1;
    TLabel *Lab;
    void __fastcall Timer1Timer(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TFMain(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFMain *FMain;
//---------------------------------------------------------------------------
void func (int *S);
int A = 0;
int* B = &A;
 
#endif
*.cpp
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFMain *FMain;
//---------------------------------------------------------------------------
__fastcall TFMain::TFMain(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void func (int *S) {
 
    switch (*S) {
        case 0 : {
            FMain->Lab->Caption = *S;
            *S =+ 1;
            *S++;// А вот эти инкременты почему-то не работают, значение не увеличивается... Почему так?
            *S++;
            *S++;
            *S++;
            break;
        }
        case 1 : {
            FMain->Lab->Caption = *S;
            *S += 1;
            break;
        }
        case 2 : {
            FMain->Lab->Caption = *S;
            *S += 1;
            break;
        }
        case 3 : {
            FMain->Lab->Caption = *S;
            *S += 1;
            break;
        }
        case 4 : {
            FMain->Lab->Caption = *S;
            *S += 1;
            break;
        }
        case 5 : {
            FMain->Lab->Caption = "end " + (String)*S;
            FMain->Timer1->Interval = 0;
            break;
        }
 
    default:
        ;
    }
 
}
 
//---------------------------------------------------------------------------
void __fastcall TFMain::Timer1Timer(TObject *Sender)
{
 
func (B);
ShowMessage(A);  // А здесь отлавливаем выходящее значение "А" из функции...
}
//---------------------------------------------------------------------------
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 20:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru