1:C语言中调用函数时,到底什么时候用&T,什么时候用T?(类似于& ,*也是)

我到现在,很清楚&是地址符,*是指针,比如char *a 是定义a 是一个指向char类型的指针;
a=&m是指将m的地址赋给a .基本的*和&操作我都懂!但是在主函数调用其他函数传参数时就有点迷糊,不知道什么时候该用,什么时候不该用,求大神详细解释!!下面还有问题
typedef struct BitNode
{ElemType data;
struct BitNode *lchild,*rchild; //这儿定义如果不要* 行不行??
}BitNode,*BiTree; //这儿定义如果不要* 行不行?BitNode与*BiTree分别有啥用?
int InitBiTree(BiTree *T);//这儿的*也不太懂
int CreateBiTree(BiTree *T);
int PreOrderTraverse(BiTree T);//为什么这儿又可以不要*?
int main(){
BiTree T;
InitBiTree(&T);//这儿定义如果不要& 行不行??
printf("请输入先序构造:\n");
CreateBiTree(&T);
printf("先序输出如下\n");
PreOrderTraverse(T);//为什么这儿又可以不要&?
return OK;

}
int InitBiTree(BiTree *T){ //这儿定义如果不要* 行不行??
T=NULL;
return OK;
}
int CreateBiTree(BiTree *T){
ElemType ch;
scanf_s("%c",&ch);
if(ch=='#') *T=NULL;
else {
if (!(*T = (BitNode *)malloc(sizeof(BitNode)))) exit(-1);
(*T)->data = ch;
CreateBiTree(&((*T)->lchild)); //这儿定义如果不要*&行不行??
CreateBiTree(&((*T)->rchild));
}
return OK;
}
int PreOrderTraverse(BiTree T){
if(T){
printf("%c",T->data);
PreOrderTraverse(T->lchild);

第1个回答  2014-04-19
typedef struct BitNode
{ElemType data;
struct BitNode *lchild,*rchild; //这儿定义如果不要* 行不行??不行,否则循环定义
}BitNode,*BiTree; //这儿定义如果不要* 行不行?BitNode与*BiTree分别有啥用?
//*BiTree是定义结构体指针简称,BitNode是定义结构体简称
int InitBiTree(BiTree *T);//这儿的*也不太懂
int CreateBiTree(BiTree *T);
int PreOrderTraverse(BiTree T);//为什么这儿又可以不要*?//可以用*,类型变化为指针
int main(){
BiTree T;
InitBiTree(&T);//这儿定义如果不要& 行不行??//以下要不要,关键是必须和函数参数类型匹配
printf("请输入先序构造:\n");
CreateBiTree(&T);
printf("先序输出如下\n");
PreOrderTraverse(T);//为什么这儿又可以不要&?
return OK;

}
int InitBiTree(BiTree *T){ //这儿定义如果不要* 行不行??
//这肯定不行,可以用引用代替,因为目的是初始化一个列表,如果不用*,初始化的是临时变量

T=NULL;
return OK;
}
int CreateBiTree(BiTree *T){
ElemType ch;
scanf_s("%c",&ch);
if(ch=='#') *T=NULL;
else {
if (!(*T = (BitNode *)malloc(sizeof(BitNode)))) exit(-1);
(*T)->data = ch;
CreateBiTree(&((*T)->lchild)); //这儿定义如果不要*&行不行??
CreateBiTree(&((*T)->rchild));
}
return OK;
}
第2个回答  2014-04-19
你想要改变实参的内容,那你就得用&T或*T,若只是计算实参值的结果,那就用T——就这么简单。
相似回答