参数问题

xiangmengxia 2012-10-30 02:53:55
有人能清楚的说一下参数带*和不带*,参数带&和不带&,参数带&和参数带*的区别吗?经常在书中看到这个,不是很清楚。
刚做一个二叉树的非递归遍历问题,我感觉是参数除了问题,就是不知道处在哪里,有空的帮忙看一下,谢谢!
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define OK 1
#define ERROR 0

typedef struct BiTNode{
char data;
BiTNode *rchild,*lchild;
}BiTNode,*BiTree;

typedef struct{
BiTNode *top,*base;
int stacksize;
}SqStack;

void visit(BiTNode a){
printf("%c ",a.data);
}

int InitStack(SqStack &S){
S.base=(BiTree)malloc(sizeof(BiTNode)*100);
if(!S.base)
return ERROR;
S.top=S.base;
S.stacksize=100;
return OK;
}

int SqStackEmpty(SqStack S){
if(S.top==S.base)return 1;
else return 0;
}

int Push(SqStack &S,BiTNode tree){
if(S.stacksize<=S.top-S.base){
S.base=(BiTNode*)realloc(S.base,(S.stacksize+10)*sizeof(BiTNode));
if(!S.base)return 0;
S.top=S.base+S.stacksize;
S.stacksize+=10;
}
*S.top++=tree;
return 1;
}

int Pop(SqStack &S){
if(S.top==S.base)
return 0;
S.top--;
return 1;
}

void preOrder(BiTree tree){

SqStack S;
InitStack(S);

while(tree->data!='#'||!SqStackEmpty(S)){
while(tree->data!='#'){
visit(*tree);
Push(S,*tree);
tree=tree->lchild;
}
if(!SqStackEmpty(S)){
Pop(S);
tree=tree->rchild;
}
}
}

int main(){
BiTree tree;
printf("请输入一棵树(先序,输入#表示为空):\n");
scanf("%s",&tree);
preOrder(tree);
return OK;
}
...全文
113 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hu7324829 2012-10-30
  • 打赏
  • 举报
回复
我觉得你并不是因为&和*区分不开 而不会用scanf("%s", &bittree);

首先你得知道scanf能够接受的参数是%s %c %d等等。对于自定义的结构体,你可以这么用
scanf("%c", bittree.data);

建议你还是多看看基础的书
super_admi 2012-10-30
  • 打赏
  • 举报
回复

00411078 jmp b (4113E0h)

...

00411118 jmp a (4113B0h)
...
super_admi 2012-10-30
  • 打赏
  • 举报
回复

int m;
a(&m);
0041142E lea eax,[m]
00411431 push eax
00411432 call a (411118h)
00411437 add esp,4
b( m);
0041143A lea eax,[m]
0041143D push eax
0041143E call b (411078h)
00411443 add esp,4
return (0);
00411446 xor eax,eax
super_admi 2012-10-30
  • 打赏
  • 举报
回复

void a(int* p)
{
004113B0 push ebp
004113B1 mov ebp,esp
004113B3 sub esp,0C0h
004113B9 push ebx
004113BA push esi
004113BB push edi
004113BC lea edi,[ebp-0C0h]
004113C2 mov ecx,30h
004113C7 mov eax,0CCCCCCCCh
004113CC rep stos dword ptr es:[edi]
*p = 2;
004113CE mov eax,dword ptr [p]
004113D1 mov dword ptr [eax],2
}
004113D7 pop edi
004113D8 pop esi
004113D9 pop ebx
004113DA mov esp,ebp
004113DC pop ebp
004113DD ret



void b(int& p)
{
004113E0 push ebp
004113E1 mov ebp,esp
004113E3 sub esp,0C0h
004113E9 push ebx
004113EA push esi
004113EB push edi
004113EC lea edi,[ebp-0C0h]
004113F2 mov ecx,30h
004113F7 mov eax,0CCCCCCCCh
004113FC rep stos dword ptr es:[edi]
p = 2;
004113FE mov eax,dword ptr [p]
00411401 mov dword ptr [eax],2
}
00411407 pop edi
00411408 pop esi
00411409 pop ebx
0041140A mov esp,ebp
0041140C pop ebp
0041140D ret
Alexander 2012-10-30
  • 打赏
  • 举报
回复
先确认下,LZ学过指针了没。如果没学,请直接PASS以下内容,先了解基础知识后再看这些。

TYPE fun(TYPE *p) 参数为指针,传递方式为值传
TYPE fun(TYPE &p) 传说中的“引用传递”,p称为实参的别名(也叫引用)。可以理解成p就是实参本身。
个人感觉引用传递是C++为了吸引其他语言程序员而新增的怪胎,实际应用与指针传递无异。注:C语言标准中无引用传递语法
TYPE fun(TYPE *&p) 同样是引用传递,只是实参与形参都是指针。
Code研究者 2012-10-30
  • 打赏
  • 举报
回复
scanf("%s",&tree);
这里有问题,BiTree是一个指针,你这里是给一个指针输入值,这个指针指向的就是你输入的地址,这个地址存放的什么是未知的,不会是一个树结点
函数形参中*表示要传的是一个指针
函数形参中&表示要传的是一个引用
&放在运算符的最左边表示引用,放在基他地方就是取地址
int &b=a;//引用
int *p=&a;//取址址
形参中int fun(int &b)
fun(a);//实际上是int &b=a;//是引用

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧