1、unsigned int addition (unsigned int n)unsigned int i;unsigned int sum;for (i=0;iy ? x:y)在上例的程序中,max函数在main函数之后定义,在调用之前又没有说明,因此出错。应在调用前对函数进行说明:float max (float x,float y);return (xy);也可以将函数max在函数main之前定义。23、误认为形参值的改变会影响实参的值int x=3,y=4;swap(x,y);%d,%d,x,y);int swap (int x,int y)int z;z=x;x=y;y=z;在上例中,
2、设计者的意图本想是利用swap函数交换x和y的值,但是由于实参和形参之间单向传递,在函数swap中改变了x和y值,main中的x和y是不会改变的。可以改为使用指针的形式,如下:int *p1,*p2;p1=&x ; p2=&y;swap(p1,p2);int swap (int *p1,int *p2)z=*p1;*p1=*p2;*p2=z;虽然函数swap在调用函数之后定义,而且在函数main调用之前又没有说明,但是由于swap返回值为整型,C语言规则返回值为整形的函数在调用之前可以不必说明,因此本例中是符合C语法规定的。24、函数的实参和形参类型不致。还是使用上例:int swap (in
3、t p1,int p2)z=p1;p1=p2;p2=z;C要求实参与形参的类型一致,一个为指向整型变量的指针,另一个为整型变量,类型不同,因此编译出错。25、不同类型的指针混用char x=3,*p1;int *p2;x;p2=p1;在上例中,设计者本意是想将指针p1所指的值赋p2,但是由于p1与p2所指向的类型不同,不能赋值。在赋值时必须进行强制类型转换。如:p2=(int *)p1;,*p1,*p2);指向不同类型的指针变量进行强制转换后赋值,在C中是常用的,例如,用malloc函数开辟的数据存储单元,函数的返回值是一个空指针(void),需要用强制转换成指向所需存储类型,如指向一个结构体
4、,用以组成一个链表:struct str int a; struct str *next; *p1; 用户程序列p1=(struct str *)malloc (size_t,size)在ICCAVR中,malloc函数返回的是void类型的指针,将其强制转换为struct str类型的结构体指针。26、混淆数组与指针变量的区别int i,a5;,a+);在上例中,设计者意图通过a+的操作,引用a数组的不同元素。由于C规定数组名代表数组的首地址,它的值是一个常量,因此用a+是错误的。应改为用指针变量来实现,如:int i,a5,*p;,p+);或:int a5,*p;for (p=a;pa+5;p+)27、混淆结构体类型与结构体变量的区别struct worker unsigned char num; char name20; ;worker.num=1;在上例中,只是说明了一种struct worker的结构,但是C编译器并没有为这种类型的结构体变量开辟存储空间,因此不能对结构体类型赋值。应用该类型定义了一个结体类型的变量后,才能对这个变量赋值,应改为:struct worker work;work.num=1;u