web-dev-qa-db-ja.com

C ++での*&と**&の意味

関数宣言でこれらのシンボルを数回見つけましたが、それらの意味がわかりません。

例:

void raccogli_dati(double **& V, double **p, int N) { 
  int ultimo = 3; 
  V = new double * [N/2]; 
  for(int i=0; i < N/2; i++) { 
    V[i] = new double[N/2], std :: clog << "digita " << N/2 - i
                 << " valori per la parte superiore della matrice V: "; 
    for(int j=i; j < N/2; j++) 
      std :: cin >> V[i][j], p[ultimo++][0] = (V[i][j] /= sqrt(p[i][0]*p[j][0]));
  } 
  for(int i=1; i < N/2; i++) 
    for(int j=0; j < i; j++) 
       V[i][j] = V[j][i];
}
51
sdffadsf

それは参照によってパラメーターを取得しています。したがって、最初のケースでは、参照によってポインターパラメーターを取得しているため、ポインターの値に対して行った変更はすべて関数の外部に反映されます。 2つ目は最初のものと同様ですが、唯一の違いはダブルポインタであることです。この例を参照してください。

void pass_by_value(int* p)
{
    //Allocate memory for int and store the address in p
    p = new int;
}

void pass_by_reference(int*& p)
{
    p = new int;
}

int main()
{
    int* p1 = NULL;
    int* p2 = NULL;

    pass_by_value(p1); //p1 will still be NULL after this call
    pass_by_reference(p2); //p2 's value is changed to point to the newly allocate memory

    return 0;
}
83
Naveen

最初はポインターへの参照、2番目はポインターへのポインターへの参照です。 ポインターと参照の違い のFAQも参照してください。

void foo(int*& x, int**& y) {
    // modifying x or y here will modify a or b in main
}

int main() {
    int val = 42;
    int *a  = &val;
    int **b = &a;

    foo(a, b);
    return 0;
}
14
Cat Plus Plus

これは、値ではなく参照によってポインターを渡します。これにより、たとえば、関数内のポインター(ポイント先のオブジェクトではなく)を変更できるため、呼び出し元のコードが変更を認識できます。

比較する:

void nochange( int* pointer ) //passed by value
{
   pointer++; // change will be discarded once function returns
}

void change( int*& pointer ) //passed by reference
{
   pointer++; // change will persist when function returns
}
11
sharptooth

int*intへのポインターなので、int*&は、intへのポインターへの参照でなければなりません。同様に、int**intへのポインターへのポインターなので、int**&は、intへのポインターへのポインターへの参照でなければなりません。

5
Oswald

*&は、参照によるポインタの受信を示します。これは、渡すパラメーターのエイリアスであることを意味します。そのため、渡すパラメーターに影響します。

#include <iostream>
using namespace std;

void foo(int *ptr)
{
    ptr = new int(50);    // Modifying the pointer to point to a different location
    cout << "In foo:\t" << *ptr << "\n"; 
    delete ptr ;
}

void bar(int *& ptr)
{
    ptr = new int(80);    // Modifying the pointer to point to a different location
    cout << "In bar:\t" << *ptr << "\n"; 
    // Deleting the pointer will result the actual passed parameter dangling
}
int main()
{
    int temp = 100 ;
    int *p = &temp ;

    cout << "Before foo:\t" << *p << "\n";
    foo(p) ;
    cout << "After foo:\t" << *p << "\n";

    cout << "Before bar:\t" << *p << "\n";
    bar(p) ;
    cout << "After bar:\t" << *p << "\n";

    delete p;

    return 0;
}

出力:

Before foo: 100
In foo: 50
After foo:  100
Before bar: 100
In bar: 80
After bar:  80
3
Mahesh

これらのフレーズを理解するために、いくつかのことを見てみましょう。

typedef double Foo;
void fooFunc(Foo &_bar){ ... }

つまり、参照によってdoubleを渡します。

typedef double* Foo;
void fooFunc(Foo &_bar){ ... }

現在、参照によるdoubleへのポインターを渡している。

typedef double** Foo;
void fooFunc(Foo &_bar){ ... }

最後に、参照によるdoubleへのポインターへのポインターを渡します。このようなtypedefの観点から考えると、&と*の適切な順序とその意味を理解できます。

3
wheaties

通常、変数の宣言は右から左に読むことができます。したがって、_int *ptr;_の場合は、Pointer _*_からInteger変数intになっていることを意味します。また、_int **ptr2;_が宣言されている場合、Pointer variable _*_ to Pointer variable _*_ to 整数変数int、これは"(int *)* ptr2;"と同じです

次に、_int*& rPtr;_を宣言して構文に従い、それが参照 _&_からPointer _*_で、 変数タイプint。最後に、このアプローチを_int**& rPtr2;_にも再度適用できます。これは、参照 _&_をPointer _*_を意味すると結論付けますポインタ _*_から整数intへ。

0
Juan Chavarro