関数宣言でこれらのシンボルを数回見つけましたが、それらの意味がわかりません。
例:
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];
}
それは参照によってパラメーターを取得しています。したがって、最初のケースでは、参照によってポインターパラメーターを取得しているため、ポインターの値に対して行った変更はすべて関数の外部に反映されます。 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;
}
最初はポインターへの参照、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;
}
これは、値ではなく参照によってポインターを渡します。これにより、たとえば、関数内のポインター(ポイント先のオブジェクトではなく)を変更できるため、呼び出し元のコードが変更を認識できます。
比較する:
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
}
int*
はint
へのポインターなので、int*&
は、int
へのポインターへの参照でなければなりません。同様に、int**
はint
へのポインターへのポインターなので、int**&
は、int
へのポインターへのポインターへの参照でなければなりません。
*&
は、参照によるポインタの受信を示します。これは、渡すパラメーターのエイリアスであることを意味します。そのため、渡すパラメーターに影響します。
#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
これらのフレーズを理解するために、いくつかのことを見てみましょう。
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の観点から考えると、&と*の適切な順序とその意味を理解できます。
通常、変数の宣言は右から左に読むことができます。したがって、_int *ptr;
_の場合は、Pointer _*
_からInteger変数int
になっていることを意味します。また、_int **ptr2;
_が宣言されている場合、Pointer variable _*
_ to Pointer variable _*
_ to 整数変数int
、これは"(int *)* ptr2;"
と同じです
次に、_int*& rPtr;
_を宣言して構文に従い、それが参照 _&
_からPointer _*
_で、 変数タイプint
。最後に、このアプローチを_int**& rPtr2;
_にも再度適用できます。これは、参照 _&
_をPointer _*
_を意味すると結論付けますポインタ _*
_から整数int
へ。