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);
答案 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 );
}