这个C程序的结果

来源:百度知道 编辑:UC知道 时间:2024/05/28 08:39:07
#include<stdio.h>
void swap(int *a,int *b) {
int *c;
c=a;a=b;b=c;
}
main() {
int a=3,b=5,*p1,*p2;
p1=&a;
p2=&b;
swap(p1,p2);
printf("%d%d\n",*p1,*p2);
swap(&a,&b);
printf("%d%d",*p1,*p2);
}
这个程序我的理解是,在第一次输出的时候,由于转换的p1,p2的指向,所以输出是:53
第二次输出时同样有正好正好由于实参带的是a,b的地址,所以改变了a,b的值输出是:35,
但是答案是3535这使我费解。
同时我又改了一下
#include<stdio.h>
void swap(int *a,int *b) {
int *c;
c=*a;*a=*b;*b=c;
}
main() {
int a=3,b=5,*p1,*p2;
p1=&a;
p2=&b;
swap(p1,p2);
printf("%d%d\n",*p1,*p2);
swap(&a,&b);
printf("%d%d",*p1,*p2);
}
程序这样的话就是我预想的结果,这是为什么
谁能给我系统的分析下??

先看第一段程序, 对于这个函数
void swap(int *a, int *b)
{
int *c;
c = a;
a = b;
b = c;
}
首先要理解两个要点:
1.a, b是两个指针变量, 不管他们存的是怎样的值, 对于他们来说, 这样的值都代表着地址。
2.a, b是属于swap中的局部变量。
不管你以何种方式传入数据,不管你以何种方式改变变量本身(注意:这里我说的是变量本身,对于*a的引用将不是变量本身),操作的改变仅仅局限在这个swap函数之内, 出了这个函数他们就什么用都没了。(注意这里我所说的前提)
---------------------------------------------------------------------------------
基于以上两点,我们来分析
void swap(int *a, int *b)
{
int *c;
c = a;
a = b;
b = c;
}
这段函数的作用

我们很容易被误导, 以为这里交换的是a和b所指向的内存区域的数值

事实上, 基于上面第2点, a和b的操作都仅限于他们自己本身, 通俗的说就是改变的仅是a,b的指向的位置, 他们没有改变任何有意义的实质的内容
--------------------------------------------------------------------------------------
现在分析第二段程序的这段函数:
void swap(int *a, int *b)
{
int *c;
c = *a;
*a = *b;
*b = c;
}
其实......这段函数是有BUG的....没有注意到么?
c = *a;
c是个指针变量,