Указатель в качестве аргумента
От: Andrdandr www.emdev.ru
Дата: 01.10.05 12:43
Оценка:
Итак, есть функция:
void Foo( int* pA, int nB )
{
pA = new int;
*pA = B+5;
}

теперь вызовем ее таким образом

void main()
{
...
int* c = NULL;
int d = 5;

Foo( c, d );
d = *c; // Error: Access violation address 0x0000
...
}


Вопрос: отчего такое происходит?
И каким образом можно создавать объекты, объявленные где-то, указатели на которые передаются в кач. аргумента.
Re: Указатель в качестве аргумента
От: Alexeib Япония  
Дата: 01.10.05 12:54
Оценка:
Здравствуйте, Andrdandr, Вы писали:

A>Итак, есть функция:

A>void Foo( int*& pA, int nB )
A>{
A> pA = new int;
A> *pA = nB+5;
A>}
Re: Указатель в качестве аргумента
От: Phoenickx  
Дата: 01.10.05 16:16
Оценка:
Здравствуйте, Andrdandr, Вы писали:
A> И каким образом можно создавать объекты, объявленные где-то, указатели на которые передаются в кач. аргумента.

Передавать по ссылке, как уже показали выше, а не по значению. В приведенном примере создается локальная копия переданной переменной pA, с которой потом работает функция. На фактическом аргументе (c в примере) это не отражается.
Re: Указатель в качестве аргумента
От: Kirill Kazakov Россия kirikaza.ru
Дата: 02.10.05 08:48
Оценка:
Здравствуйте, Andrdandr!

Чтобы изменить значение переменной "int" Вы обычно описываете функцию:
void F1 ( int * A )
{
    *A = 1;
}

А потом вызываете её вот так:
int X;
F1(&X);  //  далее используете X как int

или вот эдак:
int * Y;
F1(Y);  //  далее используете *Y как int

Да?

А чтобы изменить значение переменной "int*"?
Можно сделать вот так (скобки вокруг int* я поставил для удобочитамости;
они вроде бы не должны мешать компилятору, но я не совсем уверен):
void F2 ( (int*) * B )
{
    *B = new int;
}

И вызывать потом либо так:
(int*) Y;  
F1(&Y);  //  далее используете Y как указатель на int

или вот эдак:
(int*) * Z;  
F1(Z); //  далее используете *Z как указатель на int
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.