C语言程序设计(第6章指针)3
6.3指针操作符和指针表达式
6.3.1指针操作符和指针表达式
C中有两个关于指针的操作符:
& # 8226;& operator:地址运算符,&m是变量m的地址。
& # 8226;*运算符:指针运算符,* 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);
返回0;
}
void Chang (int * pt1,int * pt2)
{/*子程序实现两个值由大到小的调整*/
int t;
if(* pt1 {
t = * pt1;* pt1 = * pt2* pt2 = t;
}
return;
}
调用子程序时,实参是指针变量,形参也是指针变量。实参数与形参数相结合,call by value将指针变量传递给形参数pt1和pt2。但此时传递变量address,使得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
0条评论