第二次作业

1.#include<stdio.h>
2.int main() 
3. { 4.
int swap(int *p,int *q);//声明swap函数 5. int a,b;//定义了两个整型变量 6. scanf("%d%d",&a,&b);//用输入函数输入两个整型变量 7. int *p,*q;//定义两个指针变量
8. p
=&a; 9. q=&b;//使指针p,q分别指向a,b 10. swap(p,q);//调用swap函数 11. printf("%d %d\n",*p,*q);//输出a,b交换后的值 12. return 0; 13. 14. } 15. int swap(int *p,int *q) //定义swap函数
16{ 17.
int t; 18. t=*p; 19. *p=*q; 20. *q=t;//让*p,*q交换 21. }

(1)出现的错误及总结:

1.在输入函数中我在“”之间加上了\n,结果程序正常运行,但是不执行交换,我把\n去掉后程序正运行及执行!没弄懂为什么,希望老师解答。

2.在写调用函数体时,我没有定义自定义函数,以为在主函数已经声明不需要再写了!但是程序出错了,查书后知道,函数声明与定义不同,声明是对主函数中调用时用,定义是对调用函数进行定义。   一定要弄清楚定义!

3.经过在网络上的查找,我自己进行实验,scanf函数本身就带有换行的格式,如果果自己要加上换行符那么在程序执行过程中就必须经过一次换换行,可是我的经过一次换行仍然不行,多次换行也不行,然后我就随便输入一个数然后换行程序便正常执行调换两个数了!有经过网上寻找答案,我理解了,scanf函数是输出函数,“”里面的内容原样打出的,所以在执行时也需要打一个换行符才行!

 

(2)若被调函数体改成:

 

void swap(int *p,int *q) 
{
    int *t;
    *t=*p;
    *p=*q;
    *q=*t;
}

 

程序正常编译但是无法运行执行交换!从网上寻去答案,得出是因为没有对*t进行初始化,使得并不知道t的地址,也不知道指向什么值!如果指向的是一个重要的地址就会使程序无法正常运行!所以在使用指针前必须对其进行初始化!

 

 

(3)若被调函数体改成:

void swap(int *p,int *q) 
{
    int *t;
    t=p;
    p=q;
    q=t;
}

 程序正常编译并运行,但是并没有实现两个数交换!通过网上查阅得出了答案!一.如果函数有返回值,也只能返回一个参数,而该程序执行结果有两个参数无法被返回,所以没有交换!二.从代码可以看出,程序试图通过改变地址来改改变两个数,实际上被调函数体改变也仅仅是两个地址,等同于调换两个数,但因无法返回,最终执行结果是为未交换;况且改变地址并没有改变指针指向的值,所以也无法实现交换!

 

通过上述两个例子可以总结几个要点:

1.指针使用前必须进行初始化,否则成为野指针就会很危险!

2.注意函数返回值的使用规则!

 

posted @ 2017-03-22 07:53  Dragon.Yu  阅读(285)  评论(2编辑  收藏  举报