13

関数にポインターを渡しても、渡されるデータが変更されない理由がわかりません。関数 proto が次のようになっている場合:

void func( int *p ); 

func は p にメモリを割り当てましたが、関数の外で使用できないのはなぜですか? ポインターはアドレスだと思いましたか?

4

5 に答える 5

18

このようなものはあなたが期待することをしますが:

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にのみ適用されます。

これにはさまざまな解決策があります。それはあなたが何をしたいかによります。

于 2011-01-23T19:47:53.627 に答える
5

C および C++ の引数は、値によって渡されます。つまり、引数の型が へのポインターであるint場合、関数は実際のポインター引数のコピーを受け取りますが、指しているを変更することはできintます。

于 2011-01-23T19:47:58.510 に答える
4

あなたが何を求めているのか、言うのは本当に難しい..

私の推測-ポインタが指すメモリを変更できますが、ポインタpを「リダイレクト」または削除(またはメモリを割り当て)することはできませんか?もしそうなら、ポインタを参照として渡します:
void func( int &*p )
または、それを変更できるようにするためにダブルポインタとして
void func( int **p )
(私はポインタについて話している)

于 2011-01-23T19:47:15.723 に答える
4

ポインタアドレスです。関数にポインターを渡すと、関数は関数のスコープ外で作成されたデータを変更できます。ただし、関数外で使用するために関数内でメモリを割り当てたい場合は、ダブル ポインターを渡す必要があります。その理由は、ポインターが値によって渡され、割り当てによって、新しく割り当てられたブロックのポインターに新しい値が割り当てられるためです。ただし、関数が戻ると、その新しい値は失われます。ただし、この方法を使用して必要なことを行うことができます。

void func(int * * pp)
{
    * pp = new int;
}

次のように関数を使用します。

int * myPointer;
func(& myPointer);
// do stuff with myPointer
delete myPointer;
于 2011-01-24T02:56:25.040 に答える
1

ニコライの答えには同意しません。C++ では、引数を渡す方法が2 つあります。

f(Type Name)

はあなたのケースで、TypeNameです(実際には を意味することに注意してください)。この場合、関数内のNameは、関数に渡すオブジェクトのコピーです。int*pint *pint* p

第二の方法

f(Type & Name)

コピーは作成されませんが、代わりにオブジェクトのエイリアスが作成されるため、元のオブジェクトを変更できます。

あなたの場合、オブジェクトは type のポインタですint*。最初の構文を使用して渡すと、変更したコピーが取得され、元のポインターは変更されません。元のポインターを変更する場合は、参照渡しする必要があるため、Type =int*およびName =のp場合は取得します

f(int*& p)
于 2011-01-23T22:08:06.530 に答える