C语言中swap问题

somesky 2010-05-08 03:34:44

#include <stdio.h>

void swap(char *p1, char *p2);

int main(void) {
char str1[100]="This is my String.";
char str2[100]="Another String.";
char *p1=str1;
char *p2=str2;
printf("1---Address:p1=%p,p2=%p\n",p1,p2);
printf("Before swap:\np1:%s\np2:%s\n",p1,p2);
swap(p1,p2);
printf("4---Address:p1=%p,p2=%p\n",p1,p2);
printf("After swap:\np1:%s\np2:%s\n",p1,p2);

getchar();
return 0;
}


void swap(char *p1, char *p2) {
char *pt=p1;
p1 = p2;
p2 = pt;
}




1---Address:p1=0x22ccc0,p2=0x22cc50
Before swap:
p1:This is my String.
p2:Another String.
4---Address:p1=0x22ccc0,p2=0x22cc50
After swap:
p1:This is my String.
p2:Another String.



输出的结果怎么这样啊?P1指针的地址不是已经指向P2的地址了吗?那位高手帮我解答解答?
...全文
751 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao_julians 2010-05-09
  • 打赏
  • 举报
回复
提供一个“设计模式”
任务:
通过函数调用修改实参变量的值,设计这个函数
操作步骤:
0.确定实参变量的类型--查看定义
1.将实参变量的地址传递给函数的对应形参变量
2.定义函数的形参变量,以能正确接受传递的实参变量地址
3.函数体内用间接引用形参变量的形式实现对实参变量值的修改
实例1:修改调用函数中int a;的值
1.调用形式一定是 functionName(&a,...)
2.函数定义中对应形参一定是int *p-----用初始化形式验证:int *p=&a;
3.间接引用: *p= ...-----实际上是对实参a的赋值
实例2:修改调用函数中int *p;的值
1.调用形式一定是 functionName(&p,...)
2.函数定义中对应形参一定是int **pp-----用初始化形式验证:int *pp=&p;
3.间接引用: *pp= ...-----实际上是对实参p的赋值
  • 打赏
  • 举报
回复
C/C++ code
#include <stdio.h>

void swap(char *p1, char *p2);

int main(void) {
char str1[100]="This is my String.";
char str2[100]="Another String.";
char *p1=str1;
char *p2=str2;
printf("1---Address:p1=%p,p2=%p\n",p1,p2);
printf("Before swap:\np1:%s\np2:%s\n",p1,p2);
swap(p1,p2);
printf("4---Address:p1=%p,p2=%p\n",p1,p2);
printf("After swap:\np1:%s\np2:%s\n",p1,p2);

getchar();
return 0;
}


void swap(char *p1, char *p2) {
char *pt=p1;
p1 = p2;
p2 = pt;
}




C/C++ code
1---Address:p1=0x22ccc0,p2=0x22cc50
Before swap:
p1:This is my String.
p2:Another String.
4---Address:p1=0x22ccc0,p2=0x22cc50
After swap:
p1:This is my String.
p2:Another String.


因为你在函数swap中想要交换指针的值,需要二级指针才能完成,如果使用一级指针,必须交换指针指向的值。
d741963250 2010-05-09
  • 打赏
  • 举报
回复
当要改变指针的内容的时候改成指向指针的指针,当要改变指针所指向的值的时候用指针传指针,
南气子水 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 somesky 的回复:]
引用 9 楼 kensun0 的回复:

#include <stdio.h>

void swap(char **, char **);

int main(void)
{
char str1[100]="This is my String.";
char str2[100]="Another String.";

char *p1=str1;
char *p2=str2……
[/Quote]
a,b把p1,p2的地址传递过去了。所以可以改变
jyg19871008 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mzlogin 的回复:]

void swap(char *p1, char *p2);

这样传递的是指针的拷贝,
原指针并没有变。
这样传递指针可以改变指针指向的地址的值,
但并不能改变原指针。
[/Quote]
正解。可以改成指向指针的指针,也可以改成引用,当然引用更好一些。
某某9 2010-05-09
  • 打赏
  • 举报
回复
void swap1(char **a, char **b)
{
char *t=*a;
*a=*b;
*b=t;
}
某某9 2010-05-09
  • 打赏
  • 举报
回复
void swap1(char *&a, char *&b)
{
char *t=a;
a=b;
b=t;
}
cao_julians 2010-05-09
  • 打赏
  • 举报
回复
看来用空格无法准确定位,只能用笨办法了
========================================
用个表格“标准化”
步骤 ____调用函数部分______ 被调函数部分______ 备注
0 ______<type> x __________________________查看实参类型
1 ______f(&x,...)__________________________调用形式
2 ________________________<type> *p _______用初始化形式验证:<type>*p=&x
3 ________________________*p=...___________间接引用形参变量,实际上是引用实参变量
cao_julians 2010-05-09
  • 打赏
  • 举报
回复
用个表格“标准化”
步骤 调用函数部分 被调函数部分 备注
0 <type> x 查看实参类型
1 f(&x,...) 调用形式
2 <type> *p 用初始化形式验证:<type>*p=&x
3 *p= 间接引用形参变量,实际上是引用实参变量
somesky 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kensun0 的回复:]

#include <stdio.h>

void swap(char **, char **);

int main(void)
{
char str1[100]="This is my String.";
char str2[100]="Another String.";

char *p1=str1;
char *p2=str2;

……
[/Quote]

正解,swap里怎么回事,能否在说说?
somesky 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ccnyou 的回复:]

指针也是变量,你要改变它的值必须把地址传进去
C/C++ code

void swap(char **pa,char **pb)
{
char **p=pa;
*pa=*pb;
*pb=*p;
}
//...some code
void main()
{
//...
swap(&str1,&str2)
}
[/Quote]


输出的结果:
Before swap:
p1:This is my String
p2:Another string
1---Address:p1=0x22ccc0,p2=0x22cc50
In swap:
p1:0x22cc4c
p2:0x22cc48
4---Address:p1=0x22cc50,p2=0x22cc50
After swap:
p1:Another string
p2:Another string
南气子水 2010-05-08
  • 打赏
  • 举报
回复

swap(p1,p2);
//值传递把p1,p2的值0x22ccc0,0x22cc50传递给了形参p1,p2
void swap(char *p1, char *p2) {
char *pt=p1;
p1 = p2;
p2 = pt;
}
//函数中p1,p2的值是交换了,没错呀,但返回主函数内存释放就结束了,对主函数没影响
awenhao 2010-05-08
  • 打赏
  • 举报
回复
你这个互相交换指针的值,但对于内存中的变量,还是没有变啊,仅仅是指针变量。main函数不受影响的。
基础概念不清

应该改为:
*p = *p2;
*p2 = *p1;
*p1 = *p;

建议你看一本书
http://download.csdn.net/source/2327657
你可以下载去看看。
名字叫《程序这东西》
kensun0 2010-05-08
  • 打赏
  • 举报
回复
楼上代码经验证无误。
kensun0 2010-05-08
  • 打赏
  • 举报
回复
#include <stdio.h>

void swap(char **, char **);

int main(void)
{
char str1[100]="This is my String.";
char str2[100]="Another String.";

char *p1=str1;
char *p2=str2;

char **a,**b;
a=&p1;
b=&p2;

printf("1---Address:p1=%p,p2=%p\n",p1,p2);
printf("Before swap:\np1:%s\np2:%s\n",p1,p2);

swap(a,b);


printf("4---Address:p1=%p,p2=%p\n",p1,p2);
printf("After swap:\np1:%s\np2:%s\n",p1,p2);

getch();
return 0;
}


void swap(char **a,char **b)
{
char *pt;
pt=*a;
*a=*b;
*b=pt;
}

askar 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 askar 的回复:]
C/C++ code

void swap(char *p1[],char *p2[])
{
char *p=*p1;
p1=p2;
p2=&p;//写错了
}
[/Quote]
ccnyou 2010-05-08
  • 打赏
  • 举报
回复
指针也是变量,你要改变它的值必须把地址传进去

void swap(char **pa,char **pb)
{
char **p=pa;
*pa=*pb;
*pb=*p;
}
//...some code
void main()
{
//...
swap(&str1,&str2)
}
askar 2010-05-08
  • 打赏
  • 举报
回复

void swap(char *p1[],char *p2[])
{
char *p=*p1;
p1=p2;
p2=p1;
}
somesky 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mzlogin 的回复:]

void swap(char *p1, char *p2);

这样传递的是指针的拷贝,
原指针并没有变。
这样传递指针可以改变指针指向的地址的值,
但并不能改变原指针。
[/Quote]

那是不是一定要用&操作符传入参数才可以改变指针指向的地址的值?谢谢解答
ctwoz 2010-05-08
  • 打赏
  • 举报
回复
支持.....
加载更多回复(3)

70,031

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧