1.空链
2.预编译
3.编写头文件
目的:有些代码在程序中会被经常用到,编写成头文件可以节省时间,避免代码的重复编写。 |
4.初始化函数中的问题
(1)如果使用返回值方式(不合适) POINT *initPointLink(POINT *head){ if(head == NULL){ head = (POINT *)malloc(100); } return head; } void main(void){ POINT *head1 = NULL; POINT *head2 = NULL; head1 = initPointLink(); head1 = initPointLink(); // 第一次运行时,head1被赋值为所申请得到的空间; // 第二次运行时,head1原来空间的首地址值被第二次申请的空间首地址值所覆盖; // 这使得第一次所申请的空间不再能被“掌控”,这称为严重的“内存泄露”! }
不能使用上述方案,则,需要选择“参数传递”更改主函数的相关指针。
(2)选择“参数传递”方式 值传递 (错误) void initPointLink(POINT *head){ // head是initPointLink()函数的局部变量,是initPointLink()函数在调用时才开始申请空间的变量; // head空间与主函数的head2变量空间在内存的不同的地方。 if(head == NULL){ // 在函数被调用时,根据实参与形参的“值传递”,主函数的head2的值,被赋值给head。 head = (POINT *)malloc(100); // 现在,修改了head空间的值,但是,对于另外的空间head2,没有任何影响。 } }// 当返回主函数后,主函数的head2空间的值没有变化! void main(void){ POINT *head1 = NULL; POINT *head2 = NULL; initPointLink(head2); // head2的4字节空间是只能在main()函数引用的。 }
(3)选择“参数传递”方式 址传递 (正确) void initPointLink(POINT **head){ ... } void main(void){ POINT *head1 = NULL; POINT *head2 = NULL; initPointLink(&head1); }
(4)录入完整代码 initPointLink(POINT **head){ //若head所指向的空间其值为NULL,说明相关指针没有指向任何已经存在的指针,否则,不能进行初始化操作 printf("提示:任意行或列值为0,则结束输入\n"); printf("请输入点坐标(例如:3 4)");
printf("请输入点坐标(例如:3 4)"); 分析: 1)
2)
3)
|
5.输出函数中的问题
【软件工程】编程大技巧: 将一个点坐标的输出操作独立成函数,有如下几个好处: 1)符合模块功能原子化原则;一个功能函数只完成相对独立、小、少的功能,有利于程序的维护和层次化; 2)将showPoint()实现后,若出现对输出形式的修改,则,只需要修改这个函数,而所有调用该函数的语句无需更改; 3)用这种思想,可以在编程初期,逐渐形成自己的“语言环境”(被一个日本程序员称为“微语言环境”),则,利于以后的软件开发;因此,形成了很多小而实用的模块,以后的编程就成为“搭积木”。实质上,相当于在编程初期,扩充了C库函数! |
6.查找函数中的问题
指向函数的指针: