一般来说,为函数传入一个参数,如果希望函数执行完成后对参数的改动依然保留,那么有两种方式:
① 传入一个引用
② 传入一个指针
传入引用的方式很好理解,就是相当于将变量本身传入,针对变量所进行的一切修改都是直接对变量本身的修改。
传入指针则不然,传入指针后进行的修改,实际上是对指针指向的地址的内容进行修改,而不是对指针本身进行修改。比如说,指针的值是0x01cd3e2c,那么被修改的是0x01cd3e2c地址所代表的内容,指针的值0x01cd3e2c本身是不会被修改的。也就是说,传入指针,修改的是指向的内容,但指向的地址是不会变的。
即便对指针的值进行了修改,函数结束后,会发现指针的值依然不变,这是由于传入的参数不是引用造成的。传入的参数不是引用,那么对该参数进行的任何修改都不会保留到函数结束后。
比如:
void Function(int* pValue)
{
pValue = newint[10];
}
void main()
{
int*pValue = NULL;
Function(pValue); //1
}
上面的1执行完成后,会发现pValue的值依然是NULL。但是在函数体内刚对pValue进行修改时,其值却是正确的。
这是因为在函数体内,直接对pValue的值进行了修改,而非对pValue所指向的内存地址数据。pValue作为一个实参,传入后的一切修改都不会影响到自身的值,所以才会出现上述情况。
因此,改为如下代码:
void Function(int*& pValue)
{
pValue = newint[10];
}
void main()
{
int*pValue = NULL;
Function(pValue); //2
}
这样,将Function的传入参数改为指针的引用,于是对指针自身值的一切修改就都会得到保存。2执行完成后,会发现pValue的值是正确的。
指向指针的指针,也就是类似于void**。同理,void**作参数是相同的原因。
总之,如果要在函数内部修改指针自身的值,那么应该使用指针的引用或者指向指针的指针。