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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值