C言語における二次ポインタの使用

5056 ワード

C/C++でポインタを使用すると、関数伝達のパラメータを減らすことができます.たとえば、次のようになります.
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