现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

c++使用二级指针的意义

2018-10-31 13:52 工业·编程 ⁄ 共 997字 ⁄ 字号 暂无评论

对于一个函数,如果未加引用,则是按值传递,实际上只是复制了一个传入参数相同类型相同值的变量进行操作,当函数结束时,传入变量并未改变,如:

代码1:

void Func(int num)

{

    num += 1;

}

int main()

{

    int a = 1;

    Func(a);

    cout<<a<<endl;

    return 0;

}

这段代码执行时,将a的值复制给num,num加上1之后为2,但是a的值并未改变,仍为1.

同理,当有指针时,传入指针地址后,只是复制的指针地址改变了,传入的指针地址并未改变,所以指针指向的值也未改变,如:

代码2:

int b = 2;

void Func(int* num)

{

    num = &b;

}

int main()

{

    int* a = new int(1);

    Func(a);

    cout<<*a<<endl;

    return 0;

}

a的指针地址并未改变,所以输出仍是1.

当需要改变指针的值时,可以改变复制的地址的指向值,因为是复制的地址,所以地址值是相同的,则同一个地址值代表的指针值也是相同的,修改后指针的值会发生改变,如:

代码3:

void Func(int* num)

{

    ×num = 2;

}

int main()

{

    int* a = new int(1);

    Func(a);

    cout<<*a<<endl;

    return 0;

}

则输出是2.但是这样只是改变了当前地址指针的值,并未实现改变指针地址的目的。

所以,到底为什么需要二级指针呢?当函数参数为指针,我们需要动态的改变指针指向的地址(即传入不同指针)时(不使用引用),当传入的参数是二级指针变量的地址,对一级指针进行修改,则相当于对原指针地址进行了修改,可以达到目的,如以下例子:

代码4:

int* b = new int(2);

void Func(int** num)

{

    *num = b;

}

int main()

{

    int* a = new int(1);

    Func(&a);

    cout<<*a<<endl;

}

输出为2,是因为传递的是a这个指针地址的地址的复制,即a变量的地址,然后传递进去后复制这个a的地址&a,即num=&a,则*num=*(&a),*num=b,所以*(&a)=b,即a=b,所以*a指向b地址的指针,值为2.

所以,二级指针作为参数传递,可以实现改变参数指针指向的位置。

另外,二级指针可用于内存分配,本文不讨论。

 

给我留言

留言无头像?