今天写数据结构课程设计——顺序存储的线性表的C语言实现时遇到一个问题:
调用了ClearList(L1)后,再测试ListEmpty(L1)时,发现并没有置空表:
程序如下:
- status ClearList(SqList L)
- {
- if(L.elem==NULL)
- {
- return ERROR;
- }
- else
- {
- L.length = 0;
- return OK;
- }
- }
在自己苦苦思索没有结果后,果断请申椋伟来看看:
在经过单步调试后,发现不是ListEmpty()的错误,是在ClearList(L1)后,回到主程序,L1.length又变为1。
这时我们想到了“传参”!
在函数ClearList中,L1只是形参,回到主程序,立刻所有的数据又恢复原状。
应该传参传地址,所以修改后的代码为
- status ClearList(SqList *L)
- {
- if(L->elem==NULL)
- {
- return ERROR;
- }
- else
- {
- L->length = 0;
- return OK;
- }
- }
传入的参数应该为地址!
函数的形参和实参具有以下特点:
1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
牢记!
阅读(625) | 评论(0) | 转发(0) |