对于一个函数,如果未加引用,则是按值传递,实际上只是复制了一个传入参数相同类型相同值的变量进行操作,当函数结束时,传入变量并未改变,如:
代码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.
所以,二级指针作为参数传递,可以实现改变参数指针指向的位置。
另外,二级指针可用于内存分配,本文不讨论。