[c++] передача указателя функции...

marizha


void func1( int * t)
{
t= new int[1];
};
void func2(int *&t)
{
t= new int[1];
};
void main
{
int *test;
//func1(test);
//fucn2(test);
cout<<test[0];
};

если использовать func1, test останется не инициализированной переменной ...
я не пойму зачем функции передавать ссылку на указатель (func2) для его инициализации, а, в случае если я просто хочу, чтобы функция могла изменять значения - ссылки передавть не надо: достаточно того, что это указатель

skyformstd

насколько я понимаю дело обстоит так:
когда ты передал test в func1, там t получает новый адрес, указывающий на int.Но test естественно это значение не принимает(это нигде не сделано).
В func2 ты отождествляешь t и test, таким образом, когда ты в t получаешь адрес нового int, автоматически инициализируется и test.

skyformstd

вообщем это то же самое, что:
void func1(int k)
{
k=6;
}
void func2(int &k)
{
k=3;
}
void main
{
int p;
func1(p);//ничего в p не запишет, она останется неинициализированной
func2(p);//присвоит p=3
}

marizha

вовсе не тоже самое:
func1( int * t) сможет изменить содержимое t, как и func2(int *&t)
а проинициализировать не сможет ...

okunek

разницу чувствуешь?
int k, int &k
int *t, int *&t

pitrik2

вовсе не тоже самое:
func( int * t) сможет изменить содержимое t, как и func(int *&t)
а проинициализировать не сможет ...
неправда
func( int * t) НЕ СМОЖЕТ изменить содержимое t
потому что t - это указатель
его содержимое - адрес памяти
и ента функция ее изменить не может
вот то что хранится по этому адресу - это изменить сможет
вот абсолютно индентичный код твоему:
void func1(int k)
{
int* a = new int[1];
k = &a;
}
void func2(int &k)
{
int* a = new int[1];
k = &a;
}
void main
{
int* t;
int p = &t;
func1(p);//ничего в p не запишет, она останется неинициализированной
func2(p);//присвоит p указатель на тройку
cout<<test[0];
}

marizha

под "изменить" я понимал содержимое памяти, а не адрес....
теперь вроде бы понял: после передачи функции func1 указателя test, она создает свой - t, указывающий на туже область памяти....

skyformstd

в func1 новоиспеченное t не указывает туда же куда и test.

marizha

а как же тогда в test сохраняются изменения, внесенные в func1 (если проинициализировать test и передать func1, где, в свою очередь, изменить t, тогда эти изменения произойдут и с test....)

kokoc88

Очень просто. Есть понятие ЗНАЧЕНИЕ переменной. Есть понятие УКАЗАТЕЛЬ на переменную. Значение - это то, что записано в памяти, где хранится переменная. Указатель на переменную - это значение адреса памяти, где находится эта переменная. Ты передаёшь указатель по значению, то есть в твоём примере func1 получает адрес, по которому находится переменная типа int. Этот адрес она получает в переменной t. Дальше она РАЗЫМЕНУЕТ переменную t, то есть по адресу, который в ней записан, устанавливает какое-то значение.
Оставить комментарий
Имя или ник:
Комментарий: