Указатели в С
1704
8
Привет всем!
Вопрос конечно очень прост, но просто сам чего-то запутался.
Вот код:
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 не изменяется.
Как быть?
DimanKY
Саму функцию менять не надо, первый вариант был правильный.
В Вашем примере после изменения число 100 записывается в укзатель.

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

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 присвоить указатель на память, выделяемую внутри функции?
DimanKY
А здесь надо или использовать 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();
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);

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

не пробовал задавать вопросы в нормальных местах - RSDN.ru ? fido7.RU.Visual.CPP ?
fido7.su.c_cpp ?
Можно проще - передать 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 нет), хотя и так не плохо получилось.
Zen
Мдааааа...

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