昨天遇到一个问题:
***************************************************************
程序一:
char str[256] ="";
char *sp = str;
visitDepart(&rs,rs.column,sp);
**************************
static void visitDepart(result_t * rs, int num, char * spx)
{
int i = 1;
for(;i<=rs->row;i++)
{
if(strcmp(rs->result[num],rs->result[(i*rs->column)+2]) == 0)
{
strcpy(spx,"|");
spx+=strlen("|");
strcpy(spx,rs->result[(i*rs->column)+1]);
spx+=strlen(rs->result[(i*rs->column)+1]);
visitDepart(rs,i*rs->column,spx);
}
}
}
Note:这个程序表面上看是没有错误的,但是,我用它做了树的深度遍历,这就出现了问题,如下图
当有这样一颗树时,可以显示遍历结果为0-1-2-5,如果没有红圈的子树,可以遍历0-1-3.
程序二:
char str[256] ="";
char *sp = str;
int len;
visitDepart(&rs,rs.column,sp,&len);
**************************
static void visitDepart(result_t * rs, int num, char * spx,int *plen)
{
int i = 1;
for(;i<=rs->row;i++)
{
if(strcmp(rs->result[num],rs->result[(i*rs->column)+2]) == 0)
{
strcpy(spx+*plen,"|");
*plen+=strlen("|");
strcpy(spx+*plen,rs->result[(i*rs->column)+1]);
*plen+=strlen(rs->result[(i*rs->column)+1]);
visitDepart(rs,i*rs->column,spx,plen);
}
}
}
Note:这个程序可以正常遍历
分析原因:
sp指向的是str字符串的首地址,即sp变量存储的是str第一个字符的地址,通过visitDepart传递给了形参spx,spx也存储着str的首地址,通过传递遍历1和3,但当遍历3时,他没有子节点了,这时开始返回,但是递归时sp是地址的值传递(把地址作为值传递),即传给下一层递归前的spx地址并没有改变。
而程序二相当于len是一个全局变量,plen是一个地址传递,而改变的是len本身的值,所以sp始终指向str的开头,通过len来确定添加字符串的总长度。
***************************************************************
下面举例说明一下传递
***************************************************************
值传递:
void Exchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf(“x=%d,y=%d/n”,x,y)
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) //a,b变量为Exchg1函数的实际参数。
printf(“a=%d,b=%d/n”,a,b)
}
程序输出的结果是:
x=6 , y=4
a=4 , b=6
***************************************************************
地址传递:
Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d/n”,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2(&a,&b);
Print(“a=%d,b=%d/n”, a, b);
}
它的输出结果是:
*px=6,*py=4
a=6,b=4
***************************************************************
引用传递:
Exchg3(int &x, int &y) //注意定义处的形式参数的格式与值传递不同
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d/n”,x,y);
}
main()
{
int a=4;
int b=6;
Exchg3(a,b); //注意:这里调用方式与值传递一样
Print(“a=%d,b=%d/n”, a, b);
}
输出结果:
x=6, y=4
a=6, b=4 //这个输出结果与值传递不同。