関数にポインターを渡しても、渡されるデータが変更されない理由がわかりません。関数 proto が次のようになっている場合:
void func( int *p );
func は p にメモリを割り当てましたが、関数の外で使用できないのはなぜですか? ポインターはアドレスだと思いましたか?
関数にポインターを渡しても、渡されるデータが変更されない理由がわかりません。関数 proto が次のようになっている場合:
void func( int *p );
func は p にメモリを割り当てましたが、関数の外で使用できないのはなぜですか? ポインターはアドレスだと思いましたか?
このようなものはあなたが期待することをしますが:
void func(int *p)
{
*p = 1;
}
int a = 2;
func(&a);
// a is now 1
これはしません
void func(int *p)
{
p = new int;
}
int *p = NULL;
func(p);
// p is still NULL
どちらの場合も、関数は元のポインターのコピーで機能します。違いは、最初の例では、基になる整数を操作しようとしていることです。これは、そのアドレスがあるため機能します。2 番目の例では、ポインターを直接操作しており、これらの変更はcopyにのみ適用されます。
これにはさまざまな解決策があります。それはあなたが何をしたいかによります。
C および C++ の引数は、値によって渡されます。つまり、引数の型が へのポインターであるint
場合、関数は実際のポインター引数のコピーを受け取りますが、指しているを変更することはできint
ます。
あなたが何を求めているのか、言うのは本当に難しい..
私の推測-ポインタが指すメモリを変更できますが、ポインタp
を「リダイレクト」または削除(またはメモリを割り当て)することはできませんか?もしそうなら、ポインタを参照として渡します:
void func( int &*p )
または、それを変更できるようにするためにダブルポインタとして
void func( int **p )
(私はポインタについて話している)
ポインタはアドレスです。関数にポインターを渡すと、関数は関数のスコープ外で作成されたデータを変更できます。ただし、関数外で使用するために関数内でメモリを割り当てたい場合は、ダブル ポインターを渡す必要があります。その理由は、ポインターが値によって渡され、割り当てによって、新しく割り当てられたブロックのポインターに新しい値が割り当てられるためです。ただし、関数が戻ると、その新しい値は失われます。ただし、この方法を使用して必要なことを行うことができます。
void func(int * * pp)
{
* pp = new int;
}
次のように関数を使用します。
int * myPointer;
func(& myPointer);
// do stuff with myPointer
delete myPointer;
ニコライの答えには同意しません。C++ では、引数を渡す方法が2 つあります。
f(Type Name)
はあなたのケースで、TypeはNameです(実際には を意味することに注意してください)。この場合、関数内のNameは、関数に渡すオブジェクトのコピーです。int*
p
int *p
int* p
第二の方法
f(Type & Name)
コピーは作成されませんが、代わりにオブジェクトのエイリアスが作成されるため、元のオブジェクトを変更できます。
あなたの場合、オブジェクトは type のポインタですint*
。最初の構文を使用して渡すと、変更したコピーが取得され、元のポインターは変更されません。元のポインターを変更する場合は、参照渡しする必要があるため、Type =int*
およびName =のp
場合は取得します
f(int*& p)