作业帮 > 综合 > 作业

其实我一直都不理解这个指针的意思,要通俗易懂.

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/06/01 15:45:01
其实我一直都不理解这个指针的意思,要通俗易懂.
#include
int main()
{
\x05void swap(int ,int );
\x05int a,b;
\x05int *p1,*p2;
\x05scanf("%d%d",&a,&b);
\x05p1=&a;
\x05p2=&b;
\x05swap(p1,p2);
\x05printf("%d %d\n",a,b);
\x05return 0;
}
void swap(int *x,int *y)
{
\x05int *temp;
\x05{
\x05\x05temp=*x;
\x05\x05*x=*y;
\x05\x05*y=temp;
\x05}
}
在main里首先输入两个int到a和b
然后两个指针p1和p2分别指向a和b的地址.
传入swap后,两个指针x和y分别指向a和b
*x就是”x指向的那个int“
*y就是“y指向的那个int”.
于是在swap中,先把*x,也就是a的值复制一份到temp
然后把*y,也就是b的值复制到*x,也就是a那里.此时*x,也就是a,其原来的值被覆盖了(不过没关系,已经在temp备份了).
最后将temp的值(也就是原来a的值)赋值到*y,也就是b那里.
从而实现了a和b的交换.
你可以将指针看作是“门牌号码”,而变量看做是“房子”,变量的值看做“房子里的人”.这样会比较容易理解.
再问: 你好,其他的我都懂就是这里我不懂p1=&a; p2=&b; swap(p1,p2); 交换的到底是p1p2还是p1p2所指向的地址,还是&a&b?
再答: 交换的是p1和p2所指向的地址的值。p1的值和p2的值都没变。另外,p1等于&a,p2等于&b,所以也可以说交换的是a和b的值。可以看成:a和b是两个房子,p1保存了房子a的门牌号码,p2保存了房子b的门牌号码,然后程序把这两个门牌号码告诉给函数swap。注意,这里只是“告诉门牌号码”,也就是swap去拿门牌号码干任何事情,顶多影响两个房子里的内容,但p1还是保存了房子a的门牌号码,但p2还是保存了房子b的门牌号码,这个是不会被swap改变的。实际上,swap在得到两个门牌号码后立刻抄录了一份,在swap内部,x和y分别保存了房子a和房子b的门牌号码。x和y就是形式参数(形参),p1和p2是实际参数(实参)。直到swap的最后,x和y都没有变化,一直是x保存了房子a的门牌号码,y保存了房子b的门牌号码。
swap的指令其实是:void swap(int *x,int *y)
{
int *temp; // 安排一个临时房子temp,这里正确代码是int temp,没有星号。有星号的是指针,指针只是一个空洞的门牌号码,一串数字而已,而不是实际的房子,放不了人的。
{
temp=*x; // 克隆一个门牌号码x所指的房子里的人,走到temp房子里
*x=*y;   // 克隆一个门牌号码y所指的房子里的人,走到门牌号码x所指向的房子里
*y=temp; // 让刚才在temp房子里的来自门牌号码x所指向房子的克隆人走到门牌号码y所指的房子里。
}
}