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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/N1neDing/article/details/83088113

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

代码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.

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

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

猜你喜欢

转载自blog.csdn.net/N1neDing/article/details/83088113