当前位置:天才代写 > tutorial > C语言/C++ 教程 > 指针运算符与指针表达式

指针运算符与指针表达式

2017-11-04 08:00 星期六 所属: C语言/C++ 教程 浏览:405

副标题#e#

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。


#p#副标题#e#

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)
{/*子措施实现将两数值调解为由大到小*/
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;pt2=t;
}
return;
}

措施运行竣事,并未到达预期的功效,输出与输入完全沟通。其原因是对子措施来说,函数内部举办指针彼此互换指向,而在内存存放的数据并未移动,子措施挪用竣事后,main()函数中p1和p2保持原指向,功效与输入沟通。

 

    关键字:

天才代写-代写联系方式