彻底搞定C语言指针 第五篇
副标题#e#
一、三道考题
开讲之前,我先请你做三道题目。(嘿嘿,得先把你的脑子搞昏才行 ……唉呀,谁扔我鸡蛋?)
1.考题一:措施代码如下:
void Exchg1(int x, int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf (“x=%d,y=%d\n”,x,y)
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) ;
printf(“a=%d,b=%d\n”,a,b)
}
输出的功效 :
x=____, y=____
a=____, b=____
问下划线的部门应是什么,请完成。
2.考题二:代码如下。
Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d\n”,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2( &a,&b);
Print (“a=%d,b=%d\n”, a, b);
}
输出的功效为:
*px=____, *py=____
a=____, b=____
问下划线的部门应是什么,请完成。
3.考题三:
Exchg2(int &x, int &y)
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d\n”,x,y);
}
main()
{
int a=4;
int b=6;
Exchg2(a,b);
Print(“a=%d,b=%d\n”, a, b);
}
输 出的功效:
x=____, y=____
a=____, b=____
问下划线的部门输出的应是什么, 请完成。
你不在机子上试,能作出来吗?你对你写出的谜底有多大的掌握?
正确的谜底 ,想知道吗?(呵呵,让我逐步地汇报你吧!)
好,空话少说,继承我们的摸索之旅了。
我们都知道:C语言中函数参数的通报有:值通报,地点通报,引用通报这三种形式。题一为值 通报,题二为地点通报,题三为引用通报。不外,正是这几种参数通报的形式,曾把我给搞得晕头转向 。我相信也有许多人与我有同感吧?
下面请让我逐个地谈谈这三种通报形式。
#p#副标题#e#
二、函数 参数通报方法之一:值通报
1.值通报的一个错误认识
先看题一中Exchg1函数的界说:
void Exchg1(int x, int y) //界说中的x,y变量被称为Exchg1函数的形式参数
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf(“x=%d,y=% d\n”,x,y)
}
问:你认为这个函数是在做什么呀?
答:仿佛是对参数 x,y的值对换吧?
请往下看,我想操作这个函数来完成对a,b两个变量值的对换,措施如下:
void main()
{
int a=4,b=6;
Exchg1 (a,b) //a,b变量为 Exchg1函数的实际参数。
/ printf(“a=%d,b=%d\n”,a,b)
}
我问:Exchg1 ()里头的 printf(“x=%d,y=%d\n”,x,y)语句会输出什么啊?
我再问:Exchg1 ()后的 printf(“a=%d,b=%d\n”,a,b)语句输出的是什么 ?
措施输出的功效是:
x=6 , y=4
a=4 , b=6 //为什么不是a=6,b=4呢?
奇怪,显着我把a,b别离代入了x,y中,并在函数里完成了两个变量值的互换,为什么a,b变量 值照旧没有互换(仍然是a==4,b==6,而不是a==6,b==4)?假如你也会有这个疑问,那是因为你跟本 就不知实参a,b与形参x,y的干系了。
2.一个预备的知识
为了说明这个问题,我先给出 一个代码:
int a=4;
int x;
x=a;
x=x+3;
看好了没,此刻我问 你:最终a值是几多,x值是几多?
(怎么搞的,给我这个小儿科的问题。还不简朴,不就是a==4 x==7嘛!)
在这个代码中,你要大白一个对象:固然a值赋给了x,可是a变量并不是x变量哦 。我们对x任何的修改,都不会改变a变量。呵呵!固然简朴,而且一看就理所虽然,不外但是一个很重 要的认识喔。
3.领略值通报的形式
看挪用Exch1函数的代码:
main()
{
int a=4,b=6;
Exchg1(a,b) //这里挪用了Exchg1函数
printf(“a=% d,b=%d”,a,b)
}
Exchg1(a,b)时所完成的操纵代码如下所示。
int x=a;//←
int y=b;//←留意这里,头两行是挪用函数时的隐含操纵
int tmp;
tmp=x;
x=y;
y=tmp;
请留意在挪用执行Exchg1函数的操纵中我工钱地加上 了头两句:
int x=a;
int y=b;
这是挪用函数时的两个隐含行动。它确实存在, 此刻我只不外把它显式地写了出来罢了。问题一下就清晰起来啦。(看到这里,此刻你认为函数内里交 换操纵的是a,b变量可能只是x,y变量呢?)
本来 ,其实函数在挪用时是隐含地把实参a,b 的 值别离赋值给了x,y,之后在你写的Exchg1函数体内再也没有对a,b举办任何的操纵了。互换的只是x, y变量。并不是a,b.虽然a,b的值没有改变啦!函数只是把a,b的值通过赋值通报给了x,y,函数里头 操纵的只是x,y的值并不是a,b的值。这就是所谓的参数的值通报了。
#p#分页标题#e#
哈哈,终于大白了,正是 因为它隐含了那两个的赋值操纵,才让我们发生了前述的疑惑(觉得a,b已经取代了x,y,对x,y的操 作就是对a,b的操纵了,这是一个错误的概念啊!)。