1. 程式人生 > >C語言中二級指標使用

C語言中二級指標使用

C/C++中使用指標可以減少函式傳遞的引數
例如:

typedef struct
{
    int r[MAX];
    int length;
}SqList;

呼叫void test(SqList s)函式時,會把結構體SqList拷貝一份傳入函式,這樣就使得效率變低。
使用指標可以傳遞結構體,或者陣列

二維指標主要用在在子函式中有新生成的變數需要回傳回主函式。

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

使用一級指標時,使用malloc函式重新生成的結構體變數將無法傳回主函式,而是用二級指標則可以實現回傳。
需要注意:二級指標僅僅是把新分配的記憶體地址返回去,在堆上空間的分配和回收是由程式設計師自己完成,所以可以正確返回新分配的記憶體地址的值,而那些在棧上分配空間的變數,則不能用二級指標傳值,因為區域性變量出了作用域就會被編譯器釋放,例如用在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