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。 |