ポインタ配列配列パラメータ、ポインタ参照パラメータ
1246 ワード
ポインタと配列がパラメータとして関数に入力されると、アドレス、すなわち変数を指すアドレスと配列の先頭アドレスが入力され、関数でポインタや配列の値を変更することができますが、本質的には値の伝達です(変数の値伝達とは異なり、変数値伝達は実パラメータの元の値を変更しません).ポインタと配列のアドレス(アドレス付与、メモリ割り当てなど)を操作することはできません.アドレス操作にはポインタ参照またはポインタのポインタが必要です.
例:
testFun()を実行すると、ポインタ値が10になり、配列が20になります.
testFun 1()を実行すると、ポインタの値は10になり、変更されません.
testFun 2()を実行すると、ポインタリファレンスを使用してポインタ値が50になります.
testFun 3()を実行した後、ポインタリファレンスを使用してメモリ割り当てに成功し、ポインタを割り当てます.
ポインタ=ポインタのポインタ
ポインタの参照が保存されるアドレスは、実際にはポインタ自体のアドレス(すなわちint型の4バイト空間に類似)であり、それに対してアドレス付与やメモリ割り当てを行い、実際にはポインタを新しいメモリブロックのヘッダアドレス(すなわち、新しいポインタ変数アドレスを保存し、タイプが同じである場合)に再び指し示す.
const&パラメータの使用
値転送に属し、参照を使用してアドレスを転送しますが、転送された値は変更できません.
例:
int main()
{
int i = 1;
int *p = &i;
int sz[] = {1};
testFun(p, sz); //10, 20
testFun1(p); //10
testFun2(p); //50
int * p1 = NULL;
testFun3(p1);
*p1 = 10; //10
delete p1;
return 0;
}
//
void testFun(int *p, int sz[])
{
*p = 10;
sz[0] = 20;
}
//
int g_int = 50;
void testFun1(int *p)
{
p = &g_int;
}
//
void testFun2(int *&p)
{
p = &g_int;
}
//
void testFun3(int *&p)
{
p = new int;
}
testFun()を実行すると、ポインタ値が10になり、配列が20になります.
testFun 1()を実行すると、ポインタの値は10になり、変更されません.
testFun 2()を実行すると、ポインタリファレンスを使用してポインタ値が50になります.
testFun 3()を実行した後、ポインタリファレンスを使用してメモリ割り当てに成功し、ポインタを割り当てます.
ポインタ=ポインタのポインタ
ポインタの参照が保存されるアドレスは、実際にはポインタ自体のアドレス(すなわちint型の4バイト空間に類似)であり、それに対してアドレス付与やメモリ割り当てを行い、実際にはポインタを新しいメモリブロックのヘッダアドレス(すなわち、新しいポインタ変数アドレスを保存し、タイプが同じである場合)に再び指し示す.
const&パラメータの使用
値転送に属し、参照を使用してアドレスを転送しますが、転送された値は変更できません.