C指针笔记--函数中的参数指针

看到某个网友的提问,疑问如下:

void fun(int *a, int *b, int *c)
{
int *temp;
temp=a; a=b; b=temp;
*temp=*b, *b=*c; *c=*temp;
}
void main()
{ int a,b,c,*p1,*p2,*p3;
a=5; b=7; c=3;
p1=&a; p2=&b; p3=&c;
fun(p1,p2,p3);
printf("%d,%d,%d\n",a,b,c);
}b指向3,c指向5;
我求的结果:5,7,3
答案:3,7,3
求解为什么??
这个题目呢,解释比较麻烦,我不确定这位朋友的底子,只能一步一步的解释。首先我建议代码放在C++上来运行,理由我后面会说。第一步,

void fun(int *a, int *b, int *c)
{
	int *temp;
	cout<<&a<<"  "<<b<<endl;//注意输出和下面的P1比较
	temp = a; a = b; b = temp;
	*temp = *b, *b = *c; *c = *temp;
}
void main()
{  int a,b,c,*p1,*p2,*p3;
   a = 5; b = 7; c = 3;
   p1 = &a; p2 = &b; p3 = &c;
   cout<<&p1<<endl;//注意和上面的a比较。
   fun(p1,p2,p3);
   
   printf("%d,%d,%d\n",a,b,c);
}
首先来解释fun的功能,从代码来看,我不知道是我的技术太差,还是出题目的就是别人故意来扰乱人的。这个函数的功能第一步temp=a; a=b; b=temp;比较简单,我想大家都能知道,将a和b指向的地址进行交换。下面上示意图,黑色表示原来指向,红色表示运行代码后值的变动情况。

*temp=*b, *b=*c; *c=*temp;//这个也简单,*temp = *b这里毫无意义,然后就是*b = *c这段代码是将b指针指向的内存中的值更改为c指向的值,因为上一步a和b换了,所以也就是说实际上更的是原来a指向的值遭到了改变,变成了下面

这时有朋友问了就是是这样的输出p1,p2,p3不应该是3,7,3?这估计就是难点2,我们老师说改变指针的内容就会改变最终的结果,所以很多新手就会被误解。当然我们来想一想,我前面是不是说过,这段C代码用C++编译器来编译?而且我还加了段代码,看一下,就是输出fun中a的地址和main函数中p1的地址,我们会发现它2个不是同一个地址。不明白?指针当做函数的参数,实际上也是传参,而不是址,只不过,这个型的值很特殊。指针我们系统肯定也要分配内存的,它也是有地址的,它地址中存的内容就是它所指向的变量的地址。我们比较a和p1发现在fun中操作的int *变量的地址和个main中的对象的地址不同。也就是说操作的指针不是main函数中的p1,而是p1的拷贝。所以fun中的a改变了地址是不影响main中的a的值,因为fun中的a是main中的拷贝(或者说是照片),它不是main中的a。很糊涂?这么说,我们假设main中a的地址是0012ff7c,p1的地址0012FF78,p1中存放的值就是0012ff7c(也就是main中a的地址),当我们调用

fun(p1,p2,p3);

时,实际上编译器编译时候是这样编译的fun(_p1,_p2,_p3),其中_p1的并不是p1,只不过,_p1存放的值是0012ff7c,它的地址可能是0012ff80.我们在fun中改变的指针只是调换的是_p1,_p2,_p3的指向,而main中的p1依然存放的是0012ff7c,所以p1指向的值是改变了值的_p2.还是上示意图。


这就是结果输出为3,7,3的原因了。

猜你喜欢

转载自blog.csdn.net/www1157763637qqcom/article/details/21748625