指针变量做为函数参数(转贴)

指针变量做为函数参数 函数的参数不只能够是整型、实型、字符型等数据,还能够是指针类型。它的做用是将一个变量的地址传送到另外一个函数中。 【例10.3】题目同例10.2,即输入的两个整数按大小顺序输出。今用函数处理,并且用指针类型的数据做函数参数。 swap(int *p1,int *p2) {int temp; temp=*p1; *p1=*p2; *p2=temp; } 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",a,b);   }    对程序的说明: swap是用户定义的函数,它的做用是交换两个变量(a和b)的值。swap函数的形参p一、p2是指针变量。程序运行时,先执行main函数,输入a和 b的值。而后将a和b的地址分别赋给指针变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。 接着执行if语句,因为a〈b,所以执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传递给 形参变量。采起的依然是“值传递”方式。所以虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量a, p2和pointer_2指向变量b。 接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。 函数调用结束后,p1和p2不复存在(已释放)如图。 最后在main函数中输出的a和b的值是已通过交换的值。 请注意交换*p1和*p2的值是如何实现的。请找出下列程序段的错误: swap(int *p1,int *p2) {int *temp; *temp=*p1;      /*此语句有问题*/ *p1=*p2; *p2=temp; } 请考虑下面的函数可否实现实现a和b互换。 swap(int x,int y) {int temp; temp=x; x=y; y=temp; } 若是在main函数中用“swap(a,b);”调用swap函数,会有什么结果呢?请看下图所示。 【例10.4】请注意,不能企图经过改变指针形参的值而使指针实参的值改变。 swap(int *p1,int *p2) {int *p; p=p1; p1=p2; p2=p; } 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);   }    其中的问题在于不能实现如图所示的第四步(d)。 【例10.5】输入a、b、c3个整数,按大小顺序输出。 swap(int *pt1,int *pt2) {int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; } exchange(int *q1,int *q2,int *q3) { if(*q1<*q2)swap(q1,q2); if(*q1<*q3)swap(q1,q3); if(*q2<*q3)swap(q2,q3); } main() { int a,b,c,*p1,*p2,*p3;   scanf("%d,%d,%d",&a,&b,&c);   p1=&a;p2=&b; p3=&c;   exchange(p1,p2,p3);   printf("\n%d,%d,%d \n",a,b,c);   }    10.2.4        指针变量几个问题的进一步说明 指针变量能够进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算及关系运算。 1.        指针运算符 1)        取地址运算符&:取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。在scanf函数及前面介绍指针变量赋值中,咱们已经了解并使用了&运算符。 2)        取内容运算符*:取内容运算符*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符以后跟的变量必须是指针变量。 须要注意的是指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量。 【例10.6】 main(){   int a=5,*p=&a;   printf ("%d",*p); }        表示指针变量p取得了整型变量a的地址。printf("%d",*p)语句表示输出变量a的值。 2.        指针变量的运算 1)        赋值运算:指针变量的赋值运算有如下几种形式。 ①        指针变量初始化赋值,前面已做介绍。 ②        把一个变量的地址赋予指向相同数据类型的指针变量。 例如: int a,*pa; pa=&a;    /*把整型变量a的地址赋予整型指针变量pa*/ ③        把一个指针变量的值赋予指向相同类型变量的另外一个指针变量。 如:     int a,*pa=&a,*pb;     pb=pa;    /*把a的地址赋予指针变量pb*/ 因为pa,pb均为指向整型变量的指针变量,所以能够相互赋值。 ④        把数组的首地址赋予指向数组的指针变量。 例如:     int a[5],*pa;     pa=a;     (数组名表示数组的首地址,故可赋予指向数组的指针变量pa) 也可写为:     pa=&a[0];  /*数组第一个元素的地址也是整个数组的首地址,              也可赋予pa*/ 固然也可采起初始化赋值的方法:     int a[5],*pa=a; ⑤        把字符串的首地址赋予指向字符类型的指针变量。 例如:     char *pc;     pc="C Language"; 或用初始化赋值的方法写为:     char *pc="C Language"; 这里应说明的是并非把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。在后面还将详细介绍。 ⑥        把函数的入口地址赋予指向函数的指针变量。 例如:     int (*pf)();     pf=f;     /*f为函数名*/ 2)        加减算术运算     对于指向数组的指针变量,能够加上或减去一个整数n。设pa是指向数组a的指针变量,则pa+n,pa-n,pa++,++pa,pa--,--pa运算 都是合法的。指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。应该注意,数组指针变量向前或向后移动一 个位置和地址加1或减1在概念上是不一样的。由于数组能够有不一样的类型,各类类型的数组元素所占的字节长度是不一样的。如指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。例如:     int a[5],*pa;     pa=a;      /*pa指向数组a,也是指向a[0]*/ pa=pa+2;   /*pa指向a[2],即pa的值为&pa[2]*/ 指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量做加减运算是毫无心义的。 3)        两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进行运算,不然运算毫无心义。 ①        两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。其实是两个指针值(地址)相减之差再除以该数组元素的长度(字节 数)。例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每一个元素占4个字节,因此 pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。两个指针变量不能进行加法运算。 例如,pf1+pf2是什么意思呢?毫无实际意义。 ②        两指针变量进行关系运算:指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。 例如: pf1==pf2表示pf1和pf2指向同一数组元素; pf1>pf2表示pf1处于高地址位置; pf1<pf2表示pf2处于低地址位置。 指针变量还能够与0比较。 设p为指针变量,则p==0代表p是空指针,它不指向任何变量; p!=0表示p不是空指针。 空指针是由对指针变量赋予0值而获得的。 例如: #define NULL 0 int *p=NULL; 对指针变量赋0值和不赋值是不一样的。指针变量未赋值时,能够是任意值,是不能使用的。不然将形成意外错误。而指针变量赋0值后,则可使用,只是它不指向具体的变量而已。 【例10.7】 main(){   int a=10,b=20,s,t,*pa,*pb; /*说明pa,pb为整型指针变量*/   pa=&a;                     /*给指针变量pa赋值,pa指向变量a*/   pb=&b;                     /*给指针变量pb赋值,pb指向变量b*/   s=*pa+*pb;                 /*求a+b之和,(*pa就是a,*pb就是b)*/   t=*pa**pb;                 /*本行是求a*b之积*/   printf("a=%d\nb=%d\na+b=%d\na*b=%d\n",a,b,a+b,a*b);   printf("s=%d\nt=%d\n",s,t); } 【例10.8】 main(){   int a,b,c,*pmax,*pmin;             /*pmax,pmin为整型指针变量*/   printf("input three numbers:\n");  /*输入提示*/   scanf("%d%d%d",&a,&b,&c);         /*输入三个数字*/   if(a>b){                          /*若是第一个数字大于第二个数字...*/     pmax=&a;                        /*指针变量赋值*/     pmin=&b;}                       /*指针变量赋值*/   else{     pmax=&b;                        /*指针变量赋值*/     pmin=&a;}                       /*指针变量赋值*/   if(c>*pmax) pmax=&c;              /*判断并赋值*/   if(c<*pmin) pmin=&c;              /*判断并赋值*/     printf("max=%d\nmin=%d\n",*pmax,*pmin); /*输出结果*/ } 10.3        数组指针和指向数组的指针变量 一个变量有一个地址,一个数组包含若干元素,每一个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
相关文章
相关标签/搜索