C语言中二级指针使用

来源:互联网 发布:微信公众号矩阵案例 编辑:程序博客网 时间:2024/06/05 01:58

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   100043AE80   10037EA24   100037EA18   0037EA24      100037EA18   0043BEC0      10037EA18   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   10003DEBA8   003DEAB0   5003DEBA8   003DEAB0   13083592
原创粉丝点击