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

你可能感兴趣的:(C-C++)