C语言中如何在函数中对指针进行修改的各种情况

首先我们创造一个结构体,本篇通过结构体来详细描述该问题

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的成员变量进行了修改,是由于我们在该成员变量的地址上进行操作。

结论

综上所述,如果我们想在函数中直接修改该结构体指针为另一指针,这时候就需要用到结构体指针的地址,就是指针的指针。如果我们在函数中修改结构体指针的成员变量,这是可以直接修改。上述结论对于指针都是如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值