说实话,做工程师这么多年了,也很尴尬,一是没有所谓的工程师证,也不知道什么是高级工程师,如何评出来的;二是用了这么多年C语言,感觉自己还是没有掌握好C语言。
今天,看了看C的基础知识时,遇到了这个程序:
#include <stdio.h> int swap(int *p1,int *p2) { int *p; p=p1; p1=p2; p2=p; return 0; } int main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",*pointer_1,*pointer_2); return 0; }
在最常用的那本谭老的教科书上,最常见这样的程序,分析其主要的问题:
如上图,我们调试,两个int型变量和指针变量的傎都是随机的,在项目中可能造成很严重的后果,如在开机启动时,如果两个变量代表着真实项目中的电流,这个地方可能要误报警,造成严重的事故。
2.野指针出现了,也叫做悬垂指针,如果这是个服务器程序,总有一天会出现问题。
如果这个程序长期运行,这两个指针成了野指针,总会出问题的。只是这个程序小,用作小例子,造不成大的问题,但这样使用指针的方法,早晚会付出代价。
3.企图通过改变指针形参的值而使指针实参的值改变
int swap(int *p1,int *p2) { int *p; p=p1; p1=p2; p2=p; return 0; }
这个程序出现了问题,我们运行一下程序,发现并没有按我们要求输出大小数,原因就是函数传参数时,只是对实参做了一份拷贝,使用指针做函数形参时,这里只是对两个形参做了一下交换,局域函数退出时,形参也就消亡了,并没改变实参指针所指向的内容。
通过以上分析,我们得到正确的程序如下:
#include <stdio.h> int swap(int *p1,int *p2) { int temp=0; temp=*p1; *p1=*p2; *p2=temp; return 0; } int main() { int a=0,b=0; int *pointer_1=NULL,*pointer_2=NULL; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); pointer_1=NULL; pointer_2=NULL; return 0; }
虽然,这个例子很简单,但我们可以看到,学好C不大容易,正因为它太自由了,如果不使用工具一点点调试,很难提高。
希望大家,通过这个例子,有一个好的学习方法和态度,使自己成为高手。
本文出自 “LinuxQt济南高新区” 博客,请务必保留此出处http://qtlinux.blog.51cto.com/3052744/1386312
原文:http://qtlinux.blog.51cto.com/3052744/1386312