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

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

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

Сама ситуация: Решил разобраться с ссылками и указателями до основания. С ссылками вроде все прокатило, а вот с указателями ну ни как. Сделал такую программку (смысл: считает сколько раз срабатывает событие 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);  // А здесь отлавливаем выходящее значение "А" из функции...
}
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 22:06     Указатели и ссылки. Помогите разобраться с синтаксисом
Посмотрите здесь:

Указатели и ссылки C++
C++ Указатели и ссылки
не могу разобраться с синтаксисом C++
C++ Помогите с синтаксисом
Указатели и Ссылки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
28.10.2011, 22:54     Указатели и ссылки. Помогите разобраться с синтаксисом #2
++ имеет приоритет над *
надо писать так
C
1
(*S)++;
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
28.10.2011, 22:59     Указатели и ссылки. Помогите разобраться с синтаксисом #3
Цитата Сообщение от Кгин Посмотреть сообщение
С указателями немного по другому. При использовании указателей, необходимо, прежде чем передать его функции поместить адрес, который необходимо передать, в переменную, и его уже передавать в вызываемую функцию. Тогда функция получает не содержимое памяти, а адрес, по которому она может получить значение.... ...Я все правильно понял?
Нет Параметр функции это обычная переменная. Т.е, когда вызывается функция void func(int* S) c аргументом B
C++
1
func(B);
переменной int* S просто присваивается адрес хранящийся в переменной B. Т.е, грубо говоря, нет никакой разницы как ты передаешь адрес в функцию, так
C++
1
2
3
4
int A = 0;
int* B = &A;
//...
func(B);
или так
C++
1
func(&A);
В обоих случаях переменная int* S получит адрес переменной A.
Кгин
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 25
28.10.2011, 23:50  [ТС]     Указатели и ссылки. Помогите разобраться с синтаксисом #4
Цитата Сообщение от rangerx Посмотреть сообщение
Нет Параметр функции это обычная переменная. Т.е, когда вызывается функция void func(int* S) c аргументом B
C++
1
func(B);
переменной int* S просто присваивается адрес хранящийся в переменной B. Т.е, грубо говоря, нет никакой разницы как ты передаешь адрес в функцию, так
C++
1
2
3
4
int A = 0;
int* B = &A;
//...
func(B);
или так
C++
1
func(&A);
В обоих случаях переменная int* S получит адрес переменной A.
Да действительно, нет разницы... Но для меня важнее сам смысл работы указателя внутри функции потом.

Добавлено через 11 минут
Цитата Сообщение от OstapBender Посмотреть сообщение
++ имеет приоритет над *
надо писать так
C
1
(*S)++;
Т. е. получается
так увеличивается значение:
C++
1
(*S)++;
А вот так если указатель указывает на первый элемент массива, то без скобок вот эта инструкция позволяет перейти к следующему элементу массива.
C++
1
*S++;
Наконец-то появился лучик света в темноте, все начинает проясняться...
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
29.10.2011, 15:18     Указатели и ссылки. Помогите разобраться с синтаксисом #5
Кгин, точно.
и во 2 случае унарная * "повисает в воздухе"
Кгин
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 25
29.10.2011, 17:41  [ТС]     Указатели и ссылки. Помогите разобраться с синтаксисом #6
Цитата Сообщение от OstapBender Посмотреть сообщение
Кгин, точно.
и во 2 случае унарная * "повисает в воздухе"
То есть там "разыменователь" можно вообще не писать?
Yandex
Объявления
29.10.2011, 17:41     Указатели и ссылки. Помогите разобраться с синтаксисом
Ответ Создать тему
Опции темы

Текущее время: 02:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru