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);
最佳答案
这是在 C 中引入引用的一种方法。在第一种情况下,函数 insert 可以更改指针 left
如果它将像函数 serach
中那样按值传递> 那么函数insert的任何参数的改变都不会应用到原来的指针上。因此,该函数“通过引用”接受参数。
在第二种情况下,当使用函数搜索时,左指针不会改变。
考虑下面的例子会更清楚
#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 );
}
关于c - 为什么我们这里使用 "&"(: insert(&(*root)->left,值);但我们这里不使用 "&": search(root->left,值);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25045118/