指针运算符与指针表达式
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。 运行程序: 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保持原指向,结果与输入相同。
|
- 上一篇:指针变量的定义与引用
- 下一篇:指针与数组