指针运算符与指针表达式
点击次数:25 次 发布日期:2008-12-01 11:58:39 作者:源代码网
|
源代码网推荐在c中有两个关于指针的运算符: 源代码网推荐•&运算符:取地址运算符,&m即是变量m的地址。 源代码网推荐•*运算符:指针运算符,*ptr表示其所指向的变量。 源代码网推荐[例6-2]从键盘输入两个整数,按由大到小的顺序输出。 源代码网推荐main() 源代码网推荐{ 源代码网推荐int*p1,*p2,a,b,t;/*定义指针变量与整型变量*/ 源代码网推荐scanf("%d,%d",&a,&b); 源代码网推荐p1=&a;/*使指针变量指向整型变量*/ 源代码网推荐p2=&b; 源代码网推荐if(*p1<*p2) 源代码网推荐{/*交换指针变量指向的整型变量*/ 源代码网推荐t=*p1; 源代码网推荐*p1=*p2; 源代码网推荐*p2=t; 源代码网推荐} 源代码网推荐printf("%d,%d\n",a,b); 源代码网推荐} 源代码网推荐在程序中,当执行赋值操作p1=&a和p2=&b后,指针实实在在地指向了变量a与b,这时 源代码网推荐引用指针*p1与*p2,就代表了变量a与b。 源代码网推荐运行程序: 源代码网推荐run 源代码网推荐3,4 源代码网推荐4,3 源代码网推荐在程序运行过程中,指针与所指的变量之间的关系如图6-4所示: 源代码网推荐 源代码网推荐当指针被赋值后,其在内存的安放如a),当数据比较后进行交换,这时,指针变量与所指向的变量的关系如b)所示,在程序的运行过程中,指针变量与所指向的变量其指向始终没变。 源代码网推荐下面对程序做修改。 源代码网推荐[例6-3] 源代码网推荐main() 源代码网推荐{ 源代码网推荐int*p1,*p2,a,b,*t; 源代码网推荐scanf("%d,%d",&a,&b); 源代码网推荐p1=&a; 源代码网推荐p2=&b; 源代码网推荐if(*p1<*p2) 源代码网推荐{/*指针交换指向*/ 源代码网推荐t=p1; 源代码网推荐p1=p2; 源代码网推荐p2=t; 源代码网推荐} 源代码网推荐printf("%d,%d\n",*p1,*p2); 源代码网推荐} 源代码网推荐程序的运行结果完全相同,但程序在运行过程中,实际存放在内存中的数据没有移动,而是将指向该变量的指针交换了指向。其示意如图6-5: 源代码网推荐 源代码网推荐当指针交换指向后,p1和p2由原来指向的变量a和b改变为指向变量b和a,这样一来,*p1就表示变量b,而*p2就表示变量a。在上述程序中,无论在何时,只要指针与所指向的变量满足p=&a;我们就可以对变量a以指针的形式来表示。此时p等效于&a,*p等效于变量a。 源代码网推荐6.3.2指针变量作函数的参数 源代码网推荐函数的参数可以是我们在前面学过的简单数据类型,也可以是指针类型。使用指针类型做函数的参数,实际向函数传递的是变量的地址。由于子程序中获得了所传递变量的地址,在该地址空间的数据当子程序调用结束后被物理地保留下来。 源代码网推荐[例6-4]利用指针变量作为函数的参数,用子程序的方法再次实现上述功能。 源代码网推荐main() 源代码网推荐{ 源代码网推荐void chang();/*函数声明*/ 源代码网推荐int*p1,*p2,a,b,*t; 源代码网推荐scanf("%d,%d",&a,&b); 源代码网推荐p1=&a; 源代码网推荐p2=&b; 源代码网推荐chang(p1,p2);/*子程序调用*/ 源代码网推荐printf("%d,%d\n",*p1,*p2); 源代码网推荐return0; 源代码网推荐} 源代码网推荐void chang(int*pt1,int*pt2) 源代码网推荐{/*子程序实现将两数值调整为由大到小*/ 源代码网推荐intt; 源代码网推荐if(*pt1<*pt2)/*交换内存变量的值*/ 源代码网推荐{ 源代码网推荐t=*pt1;*pt1=*pt2;*pt2=t;} 源代码网推荐return; 源代码网推荐} 源代码网推荐由于在调用子程序时,实际参数是指针变量,形式参数也是指针变量,实参与形参相结合,传值调用将指针变量传递给形式参数pt1和pt2。但此时传值传递的是变量地址,使得在子程序中pt1和pt2具有了p1和p2的值,指向了与调用程序相同的内存变量,并对其在内存存放的数据进行了交换,其效果与[例6-2]相同。 源代码网推荐思考下面的程序,是否也能达到相同的效果呢? 源代码网推荐main() 源代码网推荐{ 源代码网推荐void chang(); 源代码网推荐int*p1,*p2,a,b,*t; 源代码网推荐scanf("%d,%d",&a,&b); 源代码网推荐p1=&a; 源代码网推荐p2=&b; 源代码网推荐chang(p1,p2); 源代码网推荐printf("%d,%d\n",*p1,*p2); 源代码网推荐} 源代码网推荐void chang(int*pt1,int*pt2) 源代码网推荐{ 源代码网推荐int*t; 源代码网推荐if(*pt1<*pt2) 源代码网推荐{ 源代码网推荐t=pt1;pt1=pt2;pt2=t; 源代码网推荐} 源代码网推荐return; 源代码网推荐} 源代码网推荐程序运行结束,并未达到预期的结果,输出与输入完全相同。其原因是对子程序来说,函数内部进行指针相互交换指向,而在内存存放的数据并未移动,子程序调用结束后,main()函数中p1和p2保持原指向,结果与输入相同。 源代码网推荐 源代码网供稿. |
