指针作为函数形参传入的应用非常广泛,比如:数组名字作为指针传入等等.
指针作为形参传入的一大好处就在于可以在函数内部改变指针指向的对象!!!注意,这里的重点是指针指向的对象,而不是改变指针本身.
指针和应用作为形参传入看似效果一样:改变指向(引用)的值,但实际上是有着本质的差别!
1.指针作为形参传入还是要经历实参到形参的拷贝,相当于新建了一个指针变量,这个指针变量指向的是原来的地址.
2.引用作为形参传入则无需拷贝,比较省时省力
具体的可以见下面的例子:
void pointer(int *p)
{
int a = 11;
printf("\n\nEnter function");
printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p);
*p =11;
printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p);
p = &a;
printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p);
printf("\nfunction return\n");
}
int main()
{
int b =22;
int *p = &b;
printf("the b address %X\n",&b);
printf("the p is point to %p , addr is %X, *p is %d",p , &p, *p);
pointer(p);
printf("\nthe p is point to %p , addr is %X, *p is %d\n",p , &p, *p);
}
运行结果:
the b address 28FF3C
the p is point to 0028FF3C , addr is 28FF38, *p is 22
Enter function
the p is point to 0028FF3C , addr is 28FF20, *p is 22
the p is point to 0028FF3C , addr is 28FF20, *p is 11
the p is point to 0028FF0C , addr is 28FF20, *p is 11
function return
the p is point to 0028FF3C , addr is 28FF38, *p is 11
这说明,在进入函数后,我们新建了一个指针.
因此,在二叉树插入,链表插入的时候,如果使用一重指针作为参数,那么必须有返回值,否则无法改变头结点的指向(也就是外侧指针的地址).
相对应的,如果没有返回值的话,需要使用二重指针来改变头结点指针的指向.此时二重指针本身的地址无法改变,但其指向的内容(头结点指针的地址)是可以改变的!!
例子可以参见我的另一篇博客点击打开链接