1
:C语言中实参变量和形参变量之间的数据传递是单向的直传递方式,形参的改变不能
使实参随之改变。看下面的程序: 题目:按先后顺序输出数值 错误程序:
/******************************************** #include
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(\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(\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 a[10]; int *p_a;//定义一个指向数组的指针 p_a =&a[0]; printf(\ for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句 { scanf(\ }
p_a =&a[0];
for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句 { printf(\ } return 0; }
/****************************************************** 以上的程序还可以由下面的程序实现:
int main (void) { int a[10]; int i; printf(\ for(i =0;i <10;i++) { scanf(\ }
for(i =0;i <10;i++) { printf(\ } 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后再打印出来。