C语言用指针法交换两个数的顺序问题

如题所述

解答:

1.    注意形式参数和实际参数的区别,主函数中的x,y是实际参数,swap函数中的a,b是形式参数。他们各有自己的存储空间,互不干扰。

2.    在程序适当位置加上输出地址的语句,即可看出为什么回到主程序后,x,y的值为什么不交换。

为了更形象,可以用图表示它们的关系:

可见,交换的只是swap函数中的a,b值,对主函数中的a,b值没有影响。

3.    修改的方法,将swap的交换变成值的交换。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-06-10
int
*p1,*p2,p;
p1
,p2
是一个指针,
例如:
int
*p1
,p;
p
=
100;
p1
=
&p;
p1
是指向一个int类型变量,
p1,的内容是所指变量p的地址,
即p在内存中地址,
如果p的内内存地址是0xffff11aa,
那p1的数值是
0xffff11aa,
*p1
是取得该变量的数值,
即p的数值,
100.
而p
是一个int类型的变量
,
p的内容是一个数值,即100.
按你所操作:int
*p1,*p2,p;
p=p1;
p1=p2;
p2=p;
你没有对三者做初始化
,
他们的内容应该是随机的,
p=p1,
将p1(某一个内存地址)赋值给p,
p1=p2,
将p2(另外一个某内存的地址)赋值给p1,
p2=p,
将p(随机数值)赋值给p2,
理论上是可以的,
因为内存地址也是一个32位的数值,
但是可能会引起系统段错误.
是错误的用法.
指针是什么类型?
指针就是一个地址.
本质就是32位的数值.
第2个回答  2019-12-19
解答:
1.
注意形式参数和实际参数的区别,主函数中的x,y是实际参数,swap函数中的a,b是形式参数。他们各有自己的存储空间,互不干扰。
2.
在程序适当位置加上输出地址的语句,即可看出为什么回到主程序后,x,y的值为什么不交换。
为了更形象,可以用图表示它们的关系:
可见,交换的只是swap函数中的a,b值,对主函数中的a,b值没有影响。
3.

修改的方法,将swap的交换变成值的交换。
第3个回答  2019-11-10
你试一试看如下的程序是否能够正常交换两个整数的数值
void
main(
)
{
void
swap(int
*a,
int
*b)
;
/*
函数原型说明
*/
int
a,
b
;
scanf(
"%d
%d",&a,&b
)
;
printf("Before
swap:
%d
%d\n",a,
b
)
;
swap(
&x,
&y
)
;
/*
调用交换两个整数的子函数,实参为指向整型的指针
*/
printf("After
swap:
%d
%d\n",
a,
b
)
;
}
void
swap(
int
*
a,
int
*
b
)
/*
交换两个整数的子函数,形参为指向整型的指针
*/
{
int
*
t
;
/*
定义一个临时指针变量
*t,以下三行用于进行两个整数的交换
*/
(
*t
)
=
(*
a)
;
(
*a
)
=
(*
b)
;
(*
b
)
=
(*
t)
;
}
第4个回答  2019-04-28
swap只是把指针地址给交换了,但是虚参是不能改变实参的,看起来是把地址交换了,但实际上等同于没换
所以,并没有改变指针地址里存的内容
#include<stdio.h>//这是用函数调用的方法,为什么这个方法为什么就不能实现。
void swap(int *a,int *b)
{
int t;
{t = *a;
*a = *b;
*b = t;}
}
void main()
{
int a,b,*x,*y;
scanf("%d %d",&a,&b);
x=&a;y=&b;
swap(x,y);
printf("%d %d\n", *x, *y);
}