为什么我们使用"&"这里:insert(&(* root) - > left,value);但我们不使用"&"这里:搜索(root-> left,value);

时间:2014-07-30 19:17:38

标签: c pointers tree double binary-tree

void instert(NODE**root, int value)
{
    ...
    insert(&(*root)->left,value);
    ...
}

void search(NODE*root, int value)
{
    ...
    search(root->left, value);
    ...
}

为什么我们在这里使用&insert(&(*root)->left,value);但我们这里不使用&search(root->left, value);

1 个答案:

答案 0 :(得分:0)

这是一种在C中引入引用的方法。在第一种情况下,函数insert可以更改指针left如果它将在函数serach中按值传递,那么任何更改函数insert的参数不会应用于原始指针。因此,该函数接受参数“by reference”。

在使用功能搜索的第二种情况下,指针左侧不会改变。

考虑以下示例

会更清楚
#include <stdio.h>
#include <stdlib.h>

void f( char **p )
{
   free( *p );
   *p = ( char * )malloc( sizeof( char ) );
   **p = 'B';
}

void g( char *p )
{
   printf( "%c\n", *p );
}

int main()
{
   char *p = ( char * )malloc( sizeof( char ) );
   *p = 'A';

   g( p );

   f( &p );

   g( p );

   free( p );
}

如果函数f不接受“通过引用”指针,那么原始点的值将不会改变。

考虑修改后的代码并比较它们的执行结果

#include <stdio.h>
#include <stdlib.h>

void f( char *p )
{
   free( p ); // OOPS! memory was freed
   p = ( char * )malloc( sizeof( char ) );
   *p = 'B';
}

void g( char *p )
{
   printf( "%c\n", *p );
}

int main()
{
   char *p = ( char * )malloc( sizeof( char ) );
   *p = 'A';

   g( p );

   f( p ); // after the call the program behaviour is undefined.

   g( p );

   free( p );
}