首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于指针的一些迷惑,两数交换

2012-08-11 
关于指针的一些疑惑,两数交换void swap(intx,inty){int temptempxxyytemp}int main(){int a3b5

关于指针的一些疑惑,两数交换
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
int main()
{
int a=3;b=5;
swap(a,b);
}

这种形式肯定无法对a,b交换。
教材给的是
void swap(int * x,int * y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;

}

疑惑1:在进行参数传递时,形参是指针变量,为何能把整型变量a传给指针变量x?
是否有必要在主函数中再加两个指针变量,int *p1=a,*p2=b??
疑惑2:
void swap(int * x,int * y)
{
int temp;
temp=*x;
x=y;
*y=temp;

}
结果又是如何?我在vs2010,结果竟交换了a,b的数值
由以上疑惑又引发我的进一步疑惑
疑惑三:我们平时定义一个int a=5;
这时为a分配了一个内存空间,假设空间地址为1001;
在1001的空间里存储着“3”这个数值(显然是二进制的),那么在哪里储存“a”这个变量的名字本身呢?

[解决办法]
疑惑一, 他不是把变量的值传给了x, 而是把变量的地址传给了x, 通过*x就可以访问变量所在地址的值, 当然也可以对其赋值。

疑惑二, 你的函数写错了, 应该如下
void swap(int *x, int *y) {
int temp = (*x);
*x = (*y);
*y = temp;
return;
}

疑惑三, 这个变量a, 所谓其名字是编译器在其生存周期内在其符合表中记录了变量a的名字, 这个名字保存在哪,这跟编译器有关, 这方面, 我就不懂了
[解决办法]
这是个用指针做函数形参,都是传址调用,和数组差不多
变量a是编译器的之后的结果随机的
[解决办法]
疑惑三其实我也想过……我想是不是在内存的.text段,还请高手解答
[解决办法]
疑惑1:在进行参数传递时,形参是指针变量,为何能把整型变量a传给指针变量x?
是否有必要在主函数中再加两个指针变量,int *p1=a,*p2=b??

>>没有必要。比如
int a = 1;
int b = 2;
那么,你大可以这么写swap(&a, &b);

当然,你要不嫌啰嗦,这么写也行:
int a = 1;
int b = 2;

int* pa = &a;
int* pb = &b;
swap(pa, pb);

疑惑2:结果又是如何?我在vs2010,结果竟交换了a,b的数值
>> 这是不可能的事情!b的值会变成a的值,而a的值不会改变。你不妨重新试试(最好将你自己写的swap函数改名为Swap,以避免和库函数重名)

疑惑3:
应该是1001~1004这个4个bytes中存储的内容是5(因为int a = 5),a是对那个整形变量的4个字节取的"名字",实际上计算机并不存储a这个名字,只是我们编程时给那4个字节内存取个名字好用.实际上程序在编译时,所有的a都转换为了那个地址空间了.编译成机器代码后,没有a这个说法了.a这个名字只存在于我们编写的代码中.

热点排行