C++中函数参数类型为指针的指针

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

在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()函数流程

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/81501621