在 C/C++ 语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。
指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值
例子如下:
- 当指针作为形参时,我们仅仅是用于改变指针所指向变量(实参)的值时,这是可以改变的。
int a = 3;
int *p = &a;
void func1(int* val){
*val = 10;
}
int main(){
cout<<*p<<endl; //输出是3;
func1(p);
cout<<*p<<endl; //输出是10;
}
- 但是要明确的是,当对指针本身进行操作时,其与普通的形参是一样的,没有任何特殊之处。
就是指针内存单元存放的的其指向地址的值。
int a = 3;
int b = 9;
int *p = &a;
void func1(int* val){
val = &b;
}
int main(){
cout<<*p<<endl; //输出是3;
func1(p);
cout<<*p<<endl; //输出是3;
/*
对指针本身所存储的变量的更改,只限于形参形式。
*/
}
- 当指针作为形参,而我们要去对其进行实际的操作时。需要采用两种方法:
- 传入指针的引用
- 借助高一级指针
int a = 3;
int *p = &a;
void func1(int *&pfather);//指针的引用
void func2(int **pfather);//二级指针
int main(){
cout<<*p<<endl; //输出是3;
func1(p);
cout<<*p<<endl; //输出是1;
func2(&p);
cout<<*p<<endl; //输出是9;
/*
对指针本身所存储的变量的更改,只限于形参形式。
*/
}
void func1(int*& pfather){
int g = 1;
pfather= &g;
}
void func2(int** pfather){
int b = 9;
*pfather= &b;
}
这也就是为什么在使用函数来构建二叉树时需要使用二级指针:
struct TreeNode {
char val;
struct TreeNode *lchild, *rchild;
TreeNode(char x) :val(x), lchild(NULL), rchild(NULL) {}
};
void CreatBTree(TreeNode** root) {
char data;
cin >> data;
if (data == '#')
*root = NULL;
else {
*root = new TreeNode(data);
CreatBTree(&((*root)->lchild)); //这里是新建一个lchild,而lchild是一个指针,对指针操作需要二重指针。
CreatBTree(&((*root)->rchild));
}
return;
}
int main(){
TreeNode* root = NULL;
//这里要对根节点指针(内部存储的内容)进行操作,生成左右子树
//因此需要使用二级指针来使root真正的改变。
//否则所有改变都是形参的变化无法影响到实参本身。
CreatBTree(&root);
}
创作不易,版权归@Soul·Top所有,转载需得到许可。
来源:CSDN
作者:Soul·Top
链接:https://blog.csdn.net/weixin_43869778/article/details/103729943