Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2015, 13:19   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию C++, указатели

Ребят, год пытаюсь писать на С++, но все никак не могу разобраться в указателях, знаю самый минимум-то, что это адрес, а для извлечения значений нужна разыменовка указателя, посмотрел коды разные, попытался что-то поменять, сделать без указателей, но никак не выходит, даже в потоке fstream они используются, т.е. применяются чаще.

Вот несколько вопросов, чем отличается например объект типа МойКласс, если

МойКласс new_obj;
МойКласс *new_obj;

Я так понял то, что там, гдле указатели-можно создавать несколько объектов, которые будут создаваться при помощи new..., но тут еще более странный код нашел, который я переделать на делфи пытался.

Код:

char token[80]; 
...

int* getToken(char *expr)
{
    static int i=0;
    type=Empty;

    if(expr[i]=='\0') //Если конец выражения
    {
        i=0;
        return 0;
    }
    while(isspace(expr[i])) i++; //Пропустить разделительные символы

    if(strchr("+-*/%^=()", expr[i]))
    {
        *token = expr[i];
        *(token+1) = '\0';
        type = Operator;
    }
    else if(isalpha(expr[i]))
    {
        *token = expr[i];
        *(token+1) = '\0';
        type = Variable;
    }
    else if(isdigit(expr[i]))
    {
        int j=0;
        token[j]=expr[i];
        while(isdigit(expr[i+1])||expr[i+1]=='.')
            token[++j]=expr[++i];
        token[j+1]='\0';
        type=Number;
    }
    i++;
    return &i;
}
1) Функция объявлена как указатель-для чего?
2) функция возвращает ссылку, почему бы просто не возвратить i?
3) *token = expr[i]; - эта строчка тоже не ясна, ведь объявили переменную не как указательную
from dark to light)

Последний раз редактировалось Алексей_2012; 26.07.2015 в 13:21.
Алексей_2012 вне форума Ответить с цитированием
Старый 26.07.2015, 13:50   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Я так понял то, что там, гдле указатели-можно создавать несколько объектов, которые будут создаваться при помощи new
Неправильно вы поняли. В первом случае, условно, будет: объект, а во втором: указатель -> объект

Цитата:
1) Функция объявлена как указатель-для чего?
Что за помесь из терминов? Есть функция, есть указатель на функцию, есть функция, возвращающая указатель на что-то... не путайте. Вы про что?

Цитата:
2) функция возвращает ссылку, почему бы просто не возвратить i?
Не ссылку, а адрес, т.е. указатель. & не только ссылка. Потому что функция возвращает указатель на инт, а не инт.

Цитата:
3) *token = expr[i]; - эта строчка тоже не ясна, ведь объявили переменную не как указательную
токен - это массив и сама переменная легко приводится к указателю на первый элемент
p51x вне форума Ответить с цитированием
Старый 26.07.2015, 13:51   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
МойКласс new_obj;
МойКласс *new_obj;
Насколько я помню:
МойКласс new_obj; - Резервируется в стеке, не требует создания и освобождения.
МойКласс *new_obj; - Указатель. Требует создания и освобождения. Размещается в куче.
Цитата:
там, гдле указатели-можно создавать несколько объектов
На один и тот же указатель?? Поосторожнее с такой философией. Так то оно так, но нужно в таком случае следить, чтоб объекты по указателю освобождались.
Цитата:
который я переделать на делфи пытался.
Зачем??
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.07.2015, 14:09   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
МойКласс new_obj; - Резервируется в стеке, не требует создания и освобождения.
Чуть аккуратней: обычно создается на стеке, не требует ручного создания и освобождения, т.к. конструктор и деструктор вызываются автоматически
p51x вне форума Ответить с цитированием
Старый 26.07.2015, 15:45   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Код:
МойКласс new_obj;                  //  сразу создает объект класса вызывая его конструктор, все переменные этого экземпляра класса будут в стеке
                                   //  по окончанию функции, в которой был объявлен класс, автоматически вызывается деструктор этого класса

МойКласс *new_obj;                 //  это только указатель на адрес в памяти, в данном случае этот адрес представлен как класс
                                   //  в стеке будет только одно значение, которое должно быть адресом на класс

МойКласс *new_obj = new МойКласс;  //  в данном случае, "new МойКласс" - создает экземпляр класса, при этом выделяется память в куче и в ней будут все переменные класса
                                   //  чтоб освободить эту память, нужно использовать delete new_obj, при этом будет вызван и деструктор класса
1) Это не функция объявлена как указатель, а функция возвращает указатель на int. В данном случае, указатель на переменную "static int i" или просто вернет 0.

2) Это не ссылка, а указатель, ссылки это немного другое. А возвращает указатель, например, для того, чтоб можно было изменить саму переменную, которая находиться по этому указателю.

3) char token[80] - это тот же самый char* как и expr. А запись *token - это обращение к первому элементу этого массива.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 02.08.2015, 21:56   #6
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Спасибо всем тем, кто помогает) но увы, все равно не понимаю принципиального отличия

Указателя на функцию от просто функции, вообще саму идею: для чего это нужно
Так же и с указателями на объект от самого объекта.

Много видео пересмотрел про указатели, все тщетно, видать плюсы - это не мое.

Хотя так же и с другими языками было , главное-желание понять.

Почему-то вспомнил слова друга, про ассемблер-если поймешь его, то плюсы дадутся с легкостью, видимо был он прав
from dark to light)

Последний раз редактировалось Алексей_2012; 02.08.2015 в 21:58.
Алексей_2012 вне форума Ответить с цитированием
Старый 02.08.2015, 22:24   #7
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Думаю, на этом примере будет понятно, чем отличается указатель от самого объекта класса:
Код:
#include <iostream>

using namespace std;

class A{
    long a;
    long b;
    long c;
public:
    A(long newa, long newb, long newc){
        a=newa;
        b=newb;
        c=newc;
    }
    long GetA(){
        return a;
    }
    long GetB(){
        return b;
    }
    long GetC(){
        return c;
    }

};

int main(){

    A classA(1,2,3);
    A *classAPtr;

    cout << "Address: " << &classA << endl;  //  выводи адрес класса в стеке, эти адреса и можно записывать в указатели на переменные
    cout << "Class size: " << sizeof(classA) << endl;  //  выводи размер класса в байтах, т.е. сколько он занял места в стеке
    cout << "Ptr size: " << sizeof(classAPtr) << endl;  //  выводи размер указателя на класса, т.е. сколько он занял места в стеке
    classAPtr = &classA;  //  записываем указатель
    cout << "Ptr value: " << classAPtr << endl;  //  выводи адрес класса classA, в данном случае, адресс, где находяться переменные объекта classA, т.е. в стеке

    cout << "GetA: " << classAPtr->GetA() << endl;
    cout << "GetB: " << classAPtr->GetB() << endl;
    cout << "GetC: " << classAPtr->GetC() << endl;

    return 0;
}
Резальтат работы.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 02.08.2015, 22:28   #8
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

не очень понятно, но стараюсь разобраться, спасибо, а как быть с функцией из поста 1, с вопросом из поста 6?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 02.08.2015, 22:34   #9
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Функция возвращает указатель на int, т.е. адрес, где лежит значение переменной:
Код:
static int i=0;
Но функция, которую Вы показали, может вернуть и 0 вместо указателя.

Что именно не понятно?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 02.08.2015 в 22:37.
Krasiosoft вне форума Ответить с цитированием
Старый 02.08.2015, 22:38   #10
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

ВОзможно ли ее переписать, не используя указатели?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели salmon172 Паскаль, Turbo Pascal, PascalABC.NET 0 31.05.2011 21:34
указатели Артэс Общие вопросы C/C++ 4 07.09.2010 11:08
Указатели Анютик_sexi Помощь студентам 3 16.06.2010 14:38
Указатели AquaticSoul Общие вопросы C/C++ 5 22.12.2009 15:13
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39