小议指针(一)

来源:互联网 发布:java和php哪个简单 编辑:程序博客网 时间:2024/05/18 01:21

 

 这几天自学B树,感觉到原来悬而未决的指针问题又暴露出来了,回想起当初做平衡二叉树时,曾为指针的问题困扰好久,到CSDN上请教了下指针与引用,看后似懂非懂,不曾想到今日又遇此问题:

 

1.指针与引用

C++引入了参数引用机制,从而在一定程度上避免了对指针过多的纠缠,不过引用的机制掩盖了初学者对于指针的迷茫,但是这对真正想做技术来说不一定是好事。

下面是C++的一个引用调用:

void f(int &parameter )

 {

     parameter =3;

 }

int  main()

{

   

   int a=0;

   f(a);

   printf("%d",a);

   ......     //代码略

}

 

最后打印出来的是3,而不是0,这就是C++引用调用的用处,在主函数定义的一个变量,如若我们需要在函数体内对它进行更改,我们就用引用调用,这样在函数体内对于parameter的操作我们就可以理解为是直接对主函数变量a的操作了。如果我们不采用引用调用的话,实际上的内存中的操作如下图所示:

当主函数的变量传入到调用函数中时,调用函数将会“拷贝”出一个a的副本来,这样我们直接在调用函数中的操作,实际上是对拷贝的一份操作,比如parameter=3  只是对另一个"a"进行操作,实际上在主函数的a根本没有任何改变,这也就是我们教科书上花很大篇幅教导我们那个Swap(int a,int b)不成功的原因。

但是在C中,我们没有调用引用的概念,不过借助于指针,我们完全可以模拟出引用调用的操作。那么在纯C中,我们只需要按照这个思路来写出

   

 a是主函数定义的一个变量,我们通过把它的地址传给函数体内定义的指针,使指针指向该地址,那么通过改变函数体指针的值,我们就可以改变主函数的值了。

void f(int *p)

{

    *p=3;

}

void main()

{

    int a=2;

    f(&a);

}

 

注意上面的f(&a),表示把地址传给函数体内的指针,那么指针就是指向了主函数的变量a所在内存,改变p实质就改变了a的值了,通过这种办法我们就解决C++的引用在C中实现的问题了。

 

原创粉丝点击