C言語における二次ポインタの使用
5056 ワード
C/C++でポインタを使用すると、関数伝達のパラメータを減らすことができます.たとえば、次のようになります.
2 Dポインタは、主にサブ関数で新しく生成された変数がメイン関数に戻る必要があるために使用されます.
結果は次のとおりです.
1次ポインタを使用する場合、
出力結果:
typedef struct
{
int r[MAX];
int length;
}SqList;
void test(SqList s)
関数を呼び出すと、構造体SqList
が入力関数をコピーし、効率が低下する.ポインタを使用して構造体、または配列を渡す2 Dポインタは、主にサブ関数で新しく生成された変数がメイン関数に戻る必要があるために使用されます.
void main()
{
SqList S;
S.length = 10;
SqList* l = &S;
void test3(SqList* s);
std::cout << l << " " << l->length << std::endl;
test3(l);
std::cout << l << " " << l->length << std::endl;
SqList** ll = &l;
std::cout << ll << " " << *ll << " " << " " << (*ll)->length << std::endl;
void test(SqList** s);
test(ll);
std::cout << ll << " " << *ll << " " << " " << (*ll)->length << std::endl;
}
void test(SqList** s)
{
*s = (SqList*)malloc(sizeof(SqList));
(*s)->length = 1;
std::cout << s << " " << *s << " " << " " << (*s)->length << std::endl;
}
void test3(SqList* s)
{
s = (SqList*)malloc(sizeof(SqList));
s->length = 1;
std::cout << s << " " << s->length << std::endl;
}
結果は次のとおりです.
0037EA24 10
0043AE80 1
0037EA24 10
0037EA18 0037EA24 10
0037EA18 0043BEC0 1
0037EA18 0043BEC0 1
1次ポインタを使用する場合、
malloc
関数を使用して再生成された構造体変数は、主関数に戻ることはできませんが、2次ポインタを使用すると、再送が実現されます.注意:二次ポインタは、新しく割り当てられたメモリアドレスを返すだけで、スタック上の空間の割り当てと回収はプログラマが自分で行うので、新しく割り当てられたメモリアドレスの値を正しく返すことができますが、スタック上に空間を割り当てる変数は、二次ポインタで値を伝えることができません.局所変数が作用するドメインがコンパイラによって解放されるため、例えばint型の場合、int型ローカル変数はスタックに記憶空間を割り当てるため、実際の値に戻って解放され、返される値はエラーである.次のようになります.void main()
{
int a = 10;
int* p=&a;
int** ptr;
ptr = &p;
std::cout << ptr << " " << *ptr << " " << **ptr << std::endl;
void test2(int** a);
test2(ptr);
std::cout << ptr << " " << *ptr << " " << **ptr << std::endl;
}
void test2(int** a)
{
int b = 5;
*a = &b;
std::cout << a << " " << *a << " " << **a << std::endl;
}
出力結果:
003DEBA8 003DEBB4 10
003DEBA8 003DEAB0 5
003DEBA8 003DEAB0 13083592