![]() ![]() |
|
C语言程序设计(第6章指针)3 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:00:17 文章录入:杜斌 责任编辑:杜斌 | |
|
|
6.3.1 指针运算符与指针表达式 在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。 运行程序: 3 , 4 在程序运行过程中,指针与所指的变量之间的关系如图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:
当指针交换指向后, p 1和p 2由原来指向的变量a和b改变为指向变量b和a,这样一来, * p 1 就表示变量b,而* p 2就表示变量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); return 0; } void chang(int *pt1,int *pt2) { / *子程序实现将两数值调整为由大到小* / int t; 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; p t 2 = t ; } return; } 程序运行结束,并未达到预期的结果,输出与输入完全相同。其原因是对子程序来说,函数内部进行指针相互交换指向,而在内存存放的数据并未移动,子程序调用结束后,main( )函数中p 1和p 2保持原指向,结果与输入相同。 |
|
![]() ![]() |