首先我们创造一个结构体,本篇通过结构体来详细描述该问题
struct Bitnode{
int key;
struct Bitnode *lchild;
struct Bitnode *rchild;
};
情况一
void fun1(struct Bitnode *a){
struct Bitnode *b = (struct Bitnode *)malloc(sizeof(struct Bitnode));
b->key = 1;
a = b;
}
int main(){
struct Bitnode *a = NULL;
fun1(a);
printf("%d",a->key);
return 0;
}
此时a被声明为NULL,我们想要在函数中将其修改,代码如上,j结果会报错显示地址不存在。这样是无法对其进行修改的,a仍然为NULL,如果我们在函数中对其内部成员进行修改,此时仍会报错,因为NULL中不可能会有成员变量。
如果想修改,我们就该把a的地址传入函数中,然后在进行修改,代码如下
void fun1(struct Bitnode **a){
struct Bitnode *b = (struct Bitnode *)malloc(sizeof(struct Bitnode));
b->key = 1;
*a = b;
}
int main(){
struct Bitnode *a = NULL;
fun1(&a);
printf("%d",a->key);
return 0;
}
此时结果会输出1,a也被改成了函数中的指针。
情况二
void fun1(struct Bitnode *a){
struct Bitnode *b = (struct Bitnode *)malloc(sizeof(struct Bitnode));
b->key = 1;
a = b;
}
int main(){
struct Bitnode *a = (struct Bitnode *)malloc(sizeof(struct Bitnode));
a->key = 5;
fun1(a);
printf("%d",a->key);
return 0;
}
代码如上,输出结果为5.
我们声明指针a并且已经为其申请好了地址,此时如果将其传入函数中,将另一地址赋值给它,这是不行的,函数中的a仅是形参,该参数的修改不会对主函数穿过来的数有任何影响。
如果想修改a,就用上述说明的指针的指针。
情况三
void fun1(struct Bitnode *a){
a->key = 10;
}
int main(){
struct Bitnode *a = (struct Bitnode *)malloc(sizeof(struct Bitnode));
a->key = 5;
fun1(a);
printf("%d",a->key);
return 0;
}
输出结果为10。 我们在函数中对指针a的成员变量进行了修改,是由于我们在该成员变量的地址上进行操作。
结论
综上所述,如果我们想在函数中直接修改该结构体指针为另一指针,这时候就需要用到结构体指针的地址,就是指针的指针。如果我们在函数中修改结构体指针的成员变量,这是可以直接修改。上述结论对于指针都是如此。