在C++中,每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化。
1 参数类型是非指针情况
例如,有如下函数
void func(char a)
{
a = 'a';
return;
}
使用如下方式调用func()函数
char b = 'b';
func(b);
此时,变量a是func()函数的形参,变量b是func()函数的实参。此时,在func()函数内部会创建一个临时变量保存实参的值,即字符’b’,接下来对该临时变量进行赋值,将其赋值为字符’a’,之后函数返回。此时,变量b的值并没有发生改变,其值依然是字符’b’。其流程如图1所示。
图1 func()函数流程
2函数参数类型是指针情况
函数参数是指针时包含两种情况,一种是在函数中对指针指向的内容进行修改,另一种情况是对指针本身进行修改。
2.1 对指针指向的内容进行修改
将func()函数的修改为
void func(char* a)
{
*a = 'a';
return;
}
调用func()函数的代码为
char* b = new char();
*b = 'b';
func(b);
当调用func()时,func()函数内部会有一个临时变量保存b的内容,该内容是一个char指针,指向的内容是字符’b’;接下来将该临时变量所指向的内容改为字符’a’,此时相当于指针b指向的内容被修改成了字符’a’。当函数func()返回后,temp的值被释放,但是temp指向的内容已经被修改,即字符指针b指向的内容已经被修改。
其流程如图2所示。
图2 func()函数流程
2.2指针本身进行修改
将func()函数修改为
void func(char* a)
{
a = new char();
*a = 'a';
return;
}
在func()函数中,首先创建一个临时变量保存了指针b的内容,之后对临时变量本身的内容进行修改,将其赋值为新分配的内存地址,最后将新分配的内存的内容设置为字符’a’。
调用func()的代码为
char* b = new char();
*b = 'b';
func(b);
此时,指针b指向的内容没有发生变化,仍是字符’b’。其流程如图3所示。
图3 func()函数流程
3 函数参数类型是指针的指针
将func()函数修改为
void func(char** a)
{
*a = new char();
**a = 'a';
return;
}
在func()函数中,参数类型修改为char**,即指针的指针。在函数内部,首先创建一个临时变量来保存该指针的指针,之后把该变量本身修改为一个新分配的地址,即修改了指针的指针的指向,最后把新分配的内存设置为字符’a’。调用func()函数的代码是
char* b = new char();
*b = 'b';
func(&b);
此时,指针b指向的内容发生了变化,变为字符’a’,其流程如图4所示。
图4 func()函数流程