c语言在函数中修改外部指针变量的值


最近又开始学数据结构了,总结一下之前写链表时遇到的一个问题。
如何在函数中修改一个外部指针变量的值,注意,是指针变量本身的值,而不是指针指向的变量的值,也就是说,我们要在函数中改变指针的指向。
先来看一个例子吧

  • 示例1
    void redirect(int *s) {
    	int b = 5;
    	s = &b;
    }
    int main() {
    	int* p;
    	int a = 10;
    	p = &a;
    	redirect(p);
    	printf("p=%d,a=%d", *p,a);
    	return 0;
    }
    输出:p=10,a=10
    在redirect函数中,s指向了b,但是p并未指向b,p中储存的仍然是a的地址。
    这是为什么呢?
    指针s并不是指针p本身,它仅仅是指针p的一个副本,储存了指针p的值,也就是说,指针s其实是另一个变量,它储存的地址和p储存的地址是一样的,但是改变s储存的地址,并不会改变p储存的地址。

那我们怎么才能在函数中改变指针的指向呢?
我们知道,函数是默认传递值的,而不是传递地址,想要改变一个普通变量的值,我们就需要传递它的指针给函数。
那么,想要改变指针变量的值,我们就需要传递指针的指针给函数,没错,需要使用二级指针来改变指针的值。

  • 示例2
    void redirect(int **s) {
    	int b = 5;
    	*s = &b;
    }
    int main() {
    	int* p;
    	int a = 10;
    	p = &a;
    	redirect(&p);
    	printf("p=%d,a=%d", *p,a);
    	return 0;
    }
    输出:p=5,a=10
    可以看出,这时p已经指向了b,即我们成功地在函数中改变了指针p的值。

此外,我们也可以通过引用在函数中改变指针的值。

  • 示例3:
    void redirect(int *&s) {
    	int b = 5;
    	s = &b;
    }
    int main() {
    	int* p;
    	int a = 10;
    	p = &a;
    	redirect(p);
    	printf("p=%d,a=%d", *p,a);
    	return 0;
    }
    输出:p=5,a=10
    可以看出,此时p也指向了b.

总结:

c语言在传递函数的参数时,传递给函数的,并不是变量本身,而是变量的一个拷贝。
只有在使用引用时,传递给函数的才是变量本身。
要想在函数中改变一个普通变量的值,我们需要使用指针来实现,那么要想在函数中改变一个指针变量的值,我们需要使用指针的指针,即二级指针来实现。
此外,也可以通过使用引用,传递变量本身来实现。


文章作者: pcl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 pcl !
评论
  目录