1:C语言中实参变量和形参变量之间的数据传递是单向的直传递方式,形参的改变不能使实参随之改变。看下面的程序:
题目:按先后顺序输出数值
错误程序:
/********************************************
#include Int mian () { Void swap(int *p1,int *p2); Int a =3 ,b =9; Int *pointer_1,*pointer_2;//定义两个变量分别指向变量a和b pointer_1 =&a; pointer_2 =&b; if(a { swap(pointer_1,pointer_2); } printf(\"a=%d,b=%d\ return 0; } void swap(int *p1,int *p2) { int *p; p = p1; p1 =p2; p2 =p; } 主函数中调用了函数swap,将实参pointer_1和pointer_2的值传给形参p1和p2,即p1和p2也分别指向了变量a和b,在子函数中将p1与p2的值交换,即p1指向了b,p2指向了a,但是实参pointer_1和pointer_2中的值没有随之改变,即pointer_1和pointer_2依旧分别指向a和b.随意打印出来的仍然是a=3,b=9. ***********************************************************/ 正确程序: /******************************************** #include Int mian () { Void swap(int *p1,int *p2); Int a =3 ,b =9; Int *pointer_1,*pointer_2; pointer_1 =&a; pointer_2 =&b; if(a { swap(pointer_1,pointer_2); } printf(\"a=%d,b=%d\ return 0; } void swap(int *p1,int *p2) { int temp; temp = *p1; *p1 =*p2; *p2 =temp; } 子涵数中将p1指向的变量(a)与p2指向的变量(b)互换,即将a和b的值互换,也就是a中放的是9,b中放的是3,而pointer_1和pointer_2分别指向a和b,所以打印出来发热结果是a=9,b=3. 总结:想通过调用函数来改变变量的值,应通过形参指针变量改变他们所指向的变量 ***********************************************************/ 2:通过指针应用数组元素 2.1: 我们想调用数组中的元素时有两种方法,一种是下表法,如a[2];另一种是指针法,如int *p=&a[0],p =a +2.两者都是调用a[2],但第二种方法要比第一种效率高。下面看两段程序: /****************************************************** 文件名:指针——指向数组 功能: 用指针的方法向数组赋值,用指针的方法取数组中的值 说明:好好比较两段函数的不同 ***********************************************************/ #include int main (void) { int a[10]; int *p_a;//定义一个指向数组的指针 p_a =&a[0]; printf(\"please enter ten number:\"); for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句 { scanf(\"%d\ } p_a =&a[0]; for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句 { printf(\"%d \ } return 0; } /****************************************************** 以上的程序还可以由下面的程序实现: int main (void) { int a[10]; int i; printf(\"please enter ten number:\"); for(i =0;i <10;i++) { scanf(\"%d\ } for(i =0;i <10;i++) { printf(\"%d \ } return 0; } 两段程序的功能是一样的,但第一段程序要快的多。C编译系统是将a[i]转换成*(a+i)来处理的,即用数组的首地址加上偏移地址 而用指针变量直接指向元素,不必每次都重新计算地址,P++这样的自加运算的速度是远快于a+i的。 ***********************************************************/ 2.2:程序的简写 一些牛B的程序员写程序时都是追求简洁明了的,所以对于初学者看他们的程序是很头疼的,下面看几段程序: /********************* 程序1 Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++) Printf(“%d”,*p++); 该段程序打印出来的是:1,5 *********************/ /********************* 程序2 Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++) Printf(“%d”,*++p); 该段程序打印出来的是:5,9 *********************/ /********************* 程序3 Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++) Printf(“%d”,(*p)++); 该段程序打印出来的是:1,2 *********************/ /********************* 程序4 Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++) Printf(“%d”,++*p); 该段程序打印出来的是:2,3 *********************/ *p++相当于*(p++)即先打印出出p指向的单元的值后,再将p++ *++p相当于*(++p)即先将p++,再打印出P指向的单元的值 (*p)++,先打印出*p,再将p指向的单元的值加1,如p指向a[0]=1,则相当于先打印出a[0],再将a[0]+1 ++*p相当于++(*p),将p指向的单元的值加1后再打印出来。 因篇幅问题不能全部显示,请点此查看更多更全内容