web-dev-qa-db-ja.com

C ++ポインターを関数に渡す(Howto)+ C ++ポインター操作

ポインターを渡す方法が少し混乱しています。

私は次の関数とポインタを持っているとしましょう、そして...

[〜#〜] edit [〜#〜]

...あるオブジェクトへのポインタを関数の引数として使用したい。

すなわち:

void Fun(int Pointer){
    int Fun_Ptr = ---Passed Pointer---; 
    //So that Fun_Ptr points to whatever ---Passed Pointer points to

* Pointer表記と&Pointer表記の間で、私は非常に混乱しています。 * Pointerは、それが指すものすべてを与えることを意味することを知っています。

宣言にvoid(int * pointer)を入れますか?この関数を使用する場合はどうですか?

あなたの支援に感謝します。

編集2:

さて、宣言で* variableを使用することは、ポインターが渡されることを意味することを理解しました。ただし、関数を使用する場合はどうですか?

つまり.

int main(){
    int foo;
    int *bar;
    bar = foo;
    Fun(bar);
}

編集3:さて、間違っている場合は修正してください:

上記のコードの規則に従って:

bar =&fooは、メモリ内でfooを指すようにbarを作成することを意味します

* bar = fooは、barが指す値を、fooが等しいものに等しくなるように変更することを意味します

2番目のポインター(int * oof)がある場合、次のようになります。

bar = oofは、バーがoofポインターを指すことを意味します。

bar = * oofは、バーがoofが指す値を指しますが、oofポインター自体を指しません。

* bar = * oofは、barが指す値をoofが指す値に変更することを意味します

&bar =&oofは、barが指すメモリアドレスを、oofが指すメモリアドレスと同じになるように変更することを意味します。

これは正しいですか?

編集4:すべてのあなたの助けに感謝します(私は私が複数の答えを受け入れることができることを望みますが、私は最初の答えに行かなければなりません。編集(必要に応じて参照ガイドに自由に変えてください)。

25
Biosci3c

変数を定義するときと使用するときの*使用法には違いがあります。

宣言では、

int *myVariable;

整数データ型へのポインターを意味します。ただし、使用法では、

*myVariable = 3;

ポインターを逆参照し、ポインターが指す構造を3に等しくするという意味ではなく、ポインターをメモリアドレス0x 0003に等しくします。

だからあなたの関数では、これをしたい:

void makePointerEqualSomething(int* pInteger)
{
    *pInteger = 7;
}

関数宣言では、*はポインターを渡すことを意味しますが、実際のコード本体では*はポインターが指しているものにアクセスしていることを意味します。

混乱を解消するために、アンパサンド(&)について簡単に説明します。

&は、何かのアドレス、コンピューターのメモリー内の正確な位置を取得することを意味します。

 int & myVariable;

宣言では、整数のアドレス、またはポインターを意味します!

しかしこれは

int someData;    
pInteger = &someData;

手段は、pIntegerポインター自体(ポインターはポイントするものの単なるメモリーアドレス)を 'someData'のアドレスに等しくすることを意味します-したがって、pIntegerはいくつかのデータをポイントし、それを参照するときにアクセスするために使用できます:

*pInteger += 9000;

これは理にかなっていますか?他に混乱を感じるものはありますか?

@ Edit3:

3つのステートメントを除き、ほぼ正しい

bar = *oof;

は、バーポインターが整数であり、バーが指すものではなく、無効であることを意味します。

&bar = &oof;

アンパサンドは関数のようなもので、一度メモリアドレスを返すと、元の場所を変更することはできません。このコードのように:

returnThisInt("72") = 86; 

無効ですので、あなたのものです。

最後に、

bar = oof

「バーがoofポインターを指している」という意味ではありません。むしろ、これは、oofが指すアドレスをbarが指すことを意味するため、barはoofを指すfooを指すのではなく、fooが指すものを指します。

45
Tomas

Intへのポインターを取る関数を宣言するには:

void Foo(int *x);

この機能を使用するには:

_
int x = 4;
int *x_ptr = &x;
Foo(x_ptr);
Foo(&x);
_

別のタイプのオブジェクトへのポインターが必要な場合は、ほとんど同じです。

void Foo(Object *o);

ただし、参照を使用することもできます。これらは、ポインターよりもややわかりにくいです。

_
// pass a reference
void Foo(int &x)
{
  x = 2;
}

//pass a pointer
void Foo_p(int *p)
{
   *x = 9;
}

// pass by value
void Bar(int x)
{
   x = 7;
}
int x = 4;
Foo(x);  // x now equals 2.
Foo_p(&x); // x now equals 9.
Bar(x);  // x still equals 9.
_

参照を使用すると、関数に渡されたxを(ポインターを使用する場合と同様に)変更することができますが、操作の逆参照やアドレスを心配する必要はありません。

他の人が推奨するように、 C++ FAQLite をチェックしてください。このための優れたリソースです。

3応答の編集:

bar =&fooは、メモリ内でfooを指すようにbarを作成することを意味します

はい

* bar = fooは、barが指す値を、fooが等しいものに等しくなるように変更することを意味します

はい

2番目のポインター(int * oof)がある場合、次のようになります。

bar = oofは、バーがoofポインターを指すことを意味します。

barはoofが指すものを指します。どちらも同じものを指します。

bar = * oofは、バーがoofが指す値を指しますが、oofポインター自体を指しません。

いいえ。これを行うことはできません(バーのタイプがint *であると想定)ポインターポインターを作成できます。 (int **)、しかしそれに入らないようにしましょう... intにポインタを割り当てることはできません(まあ、できますが、それは議論と一致しない詳細です)。

* bar = * oofは、barが指す値をoofが指す値に変更することを意味します

はい

&bar =&oofは、barが指すメモリアドレスを、oofが指すメモリアドレスと同じになるように変更することを意味します。

いいえ。演算子のアドレスが右辺値を返すため、これを行うことはできません。基本的に、それはあなたがそれに何かを割り当てることができないことを意味します。

15
JoshD

ポインタをintに渡すには、void Fun(int* pointer)にする必要があります。

Intへの参照を渡すと、次のようになります...

void Fun(int& ref) {
   ref = 10;
}

int main() {
   int test = 5;
   cout << test << endl;  // prints 5

   Fun(test);
   cout << test << endl;  // prints 10 because Fun modified the value

   return 1;
}
3
dgnorton

関数へのポインターへのポインターを渡したい場合は、

機能の宣言(必要な場合):

void Fun(int *ptr);

機能の定義:

void Fun(int *ptr) {
    int *other_pointer = ptr;  // other_pointer points to the same thing as ptr
    *other_ptr = 3;            // manipulate the thing they both point to
}

機能の使用:

int main() {
    int x = 2;
    printf("%d\n", x);
    Fun(&x);
    printf("%d\n", x);
}

一般的なルールとして、PtrまたはPointerと呼ばれる変数の型がintであってはならないことに注意してください。ポインタへのポインタの型はint *

2番目のポインター(int * oof)がある場合、次のようになります。

bar = oofは、バーがoofポインターを指すことを意味します。

それは「バーが同じものを指すようにする」ことを意味します。

bar = * oofは、バーがoofが指す値を指しますが、oofポインター自体を指しません。

それは何の意味もありません、それは無効です。 barはポインター*oofは整数です。一方を他方に割り当てることはできません。

* bar = * oofは、barが指す値をoofが指す値に変更することを意味します

はい。

&bar =&oofは、barが指すメモリアドレスを、oofが指すメモリアドレスと同じになるように変更することを意味します。

いいえ、それは再び無効です。 &barbar変数へのポインターですが、「右辺値」または「一時」と呼ばれるものであり、割り当てることはできません。算術計算の結果のようなものです。書くことはできませんx + 1 = 5

ポインタをアドレスと考えると役立つ場合があります。 bar = oofは、「バーを作成します。これはアドレスです。oofはアドレスでもあります」。 bar = &fooは、「fooのアドレスに等しいアドレスであるmake bar」を意味します。 bar = *oofは何でも意味し、「バーを作る」という意味で、*oof、これはintです。できません。

次に、&はアドレス演算子です。これは「オペランドのアドレス」を意味するため、&fooはfooのアドレス(つまり、fooへのポインター)です。 *は間接参照演算子です。 「オペランドで指定されたアドレスにあるもの」を意味します。 bar = &foo*barfooです。

3
Steve Jessop
void Fun(int *Pointer)
{
  //if you want to manipulate the content of the pointer:
  *Pointer=10;
  //Here we are changing the contents of Pointer to 10
}

*ポインタの前は、ポインタの内容を意味します(宣言を除く!)

&ポインタ(または任意の変数)の前にアドレスを意味します

編集:

int someint=15;
//to call the function
Fun(&someint);
//or we can also do
int *ptr;
ptr=&someint;
Fun(ptr);
1
Gustavo Puma
void Fun(int* Pointer)   -- would be called as Fun( &somevariable )

fun関数内で間接参照することで、「ポインタ」が指す内容を操作できるようになります。

*Pointer = 1;

上記のように宣言すると、それが指すものを超えてデータを操作することもできます:

int foo[10] = {0};
Fun(foo);

関数では、次のようにできます*(Pointer + 1)= 12;配列の2番目の値を設定します。

void Fun(int& Pointer)  -- would be called Fun( somevariable )

pointerが参照するものを変更できますが、この場合、Pointerが参照するもの以外にはアクセスできません。

1
Anders