最近又开始学数据结构了,总结一下之前写链表时遇到的一个问题。
如何在函数中修改一个外部指针变量的值,注意,是指针变量本身的值,而不是指针指向的变量的值,也就是说,我们要在函数中改变指针的指向。
先来看一个例子吧
- 示例1
在redirect函数中,s指向了b,但是p并未指向b,p中储存的仍然是a的地址。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
这是为什么呢?
指针s并不是指针p本身,它仅仅是指针p的一个副本,储存了指针p的值,也就是说,指针s其实是另一个变量,它储存的地址和p储存的地址是一样的,但是改变s储存的地址,并不会改变p储存的地址。
那我们怎么才能在函数中改变指针的指向呢?
我们知道,函数是默认传递值的,而不是传递地址,想要改变一个普通变量的值,我们就需要传递它的指针给函数。
那么,想要改变指针变量的值,我们就需要传递指针的指针给函数,没错,需要使用二级指针来改变指针的值。
- 示例2
可以看出,这时p已经指向了b,即我们成功地在函数中改变了指针p的值。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
此外,我们也可以通过引用在函数中改变指针的值。
- 示例3:
可以看出,此时p也指向了b.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
总结:
c语言在传递函数的参数时,传递给函数的,并不是变量本身,而是变量的一个拷贝。
只有在使用引用时,传递给函数的才是变量本身。
要想在函数中改变一个普通变量的值,我们需要使用指针来实现,那么要想在函数中改变一个指针变量的值,我们需要使用指针的指针,即二级指针来实现。
此外,也可以通过使用引用,传递变量本身来实现。