Мобильная версия форумов
Открыть
 −14°C
завтра: −15°C
Погода в Перми
−14°C
вечером−14°C
ночью−16°C
завтра−15°C
Подробно
 66,25
−0.4574
Курс USD ЦБ РФна 19 февраля
66,2470
−0.4574
 74,91
−0.3437
Курс EUR ЦБ РФна 19 февраля
74,9055
−0.3437
  • DimanKY

    Анонимный пользователь

    Привет всем!
    Вопрос конечно очень прост, но просто сам чего-то запутался.
    Вот код:
    void Test(int *t)
    {
    *t=100;
    }
    вызов функции
    int t;
    Test(&t);
    после вызова переменной t присваивается 100.

    а если у меня не переменная, а указатель на Int, т.е.
    int *t;
    то как мне переделать функцию, что бы t присваивалось 100.

    Пробовал так:
    void Test(int *t)
    {
    t=100;
    }

    int *t;
    Test(t);
    внутри функции переменной t присваивается значение 100, а вот после вызова функции, t не изменяется.
    Как быть?

  • activist

    Сообщений: 179

    Саму функцию менять не надо, первый вариант был правильный.
    В Вашем примере после изменения число 100 записывается в укзатель.

    А вот в вызове нужно кое-что поменять:
    int *t;
    t = (int*)malloc(sizeof(int));
    Test(t);
    /* Что-то делаем с t */
    free(t);

    My JID is ktak@jabber.sibnet.ru
    Мой городок

  • veteran

    Сообщений: 2344

    Или так:

    int t;
    int* ptr;

    ptr=&t;

    test(ptr);

    В функции ничего не меняется. В любом случае в нее надо передавать инициализированный указатель.

    Землю - крестьянам, фазу - электрикам!!

  • DimanKY

    Анонимный пользователь

    Спасибо, с этим я разобрался. Но у меня возник еще один вопрос: Как мне возвратить указатель на область памяти, которая выделется внутри функции. Т.е. например

    int *Test()
    {
    return (int *)malloc(1*sizeof(int));
    }
    Тут все просто, но как быть если ине надо возвратить указатель на 2 переменные. Я имею ввиду, что в функции выделяется память под две переменные:
    int *Test(int *temp)
    {
    t=(int *)malloc(1*sizeof(int));
    return (int *)malloc(1*sizeof(int));
    }
    вот вызов:
    int *temp,*t;
    t=Test(temp);
    В данном случае, t будет указывать на область памяти, а вот temp будет пустым. Как мне переменной temp присвоить указатель на память, выделяемую внутри функции?

  • guru

    Сообщений: 5269

    А здесь надо или использовать in/out параметры, или struct

    in/out:
    --------
    void Test(int **t, int **temp)
    {
    *t=(int *)malloc(1*sizeof(int));
    *temp=(int *)malloc(1*sizeof(int));
    return;
    }

    вот вызов:
    int *temp,*t;
    Test(&t, &temp);

    struct:
    ---------

    struct TwoPointers {
    int *t;
    int *temp;
    }

    TwoPointers *Test(void)
    {
    TwoPointers *twoPointersObject = (TwoPointers*)malloc(1*sizeof(TwoPointers ));
    twoPointersObject->t=(int *)malloc(1*sizeof(int));
    twoPointersObject->temp=(int *)malloc(1*sizeof(int));
    }

    вот вызов:

    TwoPointers *tp = Test();

  • Анонимный пользователь
    Можно проще - передать 2 параметра в вызываемую функцию, указатель на указатель:

    void Test(int **temp1, int **temp2)
    {
    *temp1=(int *)malloc(1*sizeof(int));
    *temp2=(int *)malloc(1*sizeof(int));
    return;
    }

    вызов:
    int *temp1, *temp2;
    Test(&temp1, &temp2);

    по-моему так. в плюсах можно использовать ссылочный тип &, если надо, могу рассказать

  • activist

    Сообщений: 325

    Мдааааа...

    не пробовал задавать вопросы в нормальных местах - RSDN.ru ? fido7.RU.Visual.CPP ?
    fido7.su.c_cpp ?

    Джордано Бруно секс-форума. =) Забанен за стихотворение.

  • DimanKY

    Анонимный пользователь

    В ответ на: Можно проще - передать 2 параметра в вызываемую функцию, указатель на указатель:

    void Test(int **temp1, int **temp2)
    {
    *temp1=(int *)malloc(1*sizeof(int));
    *temp2=(int *)malloc(1*sizeof(int));
    return;
    }

    вызов:
    int *temp1, *temp2;
    Test(&temp1, &temp2);

    по-моему так. в плюсах можно использовать ссылочный тип &, если надо, могу рассказать
    Именно так я и сделал. Действительно тип-ссылка в C++ очень удобен(жалко его в обычном C нет), хотя и так не плохо получилось.

  • DimanKY

    Анонимный пользователь

    В ответ на: Мдааааа...

    не пробовал задавать вопросы в нормальных местах - RSDN.ru ? fido7.RU.Visual.CPP ?
    fido7.su.c_cpp ?
    А чем тебе это место не нравиться? На самом деле вопрос был элементарен, но тогда я сам чего-то запутался. Да мне и здесь номрмально ответили :спок: Так что Форуму на НГС :respect:

Записей на странице:

Перейти в форум

Модератор: