C语言中指针:不能通过改变指针形参的值而使指针实参的值改变

Heessy 2015-11-18 11:01:02
#include<stdio.h>
int s(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
main()
{
int a,b;
int *p1,*p2;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if (a<b)
s(p1,p2);
printf("%d,%d",*p1,*p2);
}

这是代码1。

```
swap(int *p1,int *p2)
{int *p;
p=p1;
p1=p2;
p2=p;
}
main()
{
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;pointer_2=&b;
if(a<b) swap(pointer_1,pointer_2);
printf("\n%d,%d\n",*pointer_1,*pointer_2);
}
这是代码2。

```
#include<stdio.h>
int s(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;

}
main()
{
int a,b;
a=3;b=4;
s(a,b);
printf("%d,%d",a,b);
}
这是代码3。
下面的是我对这三个代码的理解
代码1和代码2的区别是,代码1指针地址不变,而指针地址里的内容发生了改变。代码2的地址里的内容不发生改变而是两个指针交换地址。
代码3没有指针只是一般的交换。
然后我就不理解了,如果说是形参在函数调用完毕就释放而且没有return语句的话,主函数的值应当不发生改变。这样的话,代码1的主函数的实参数值交换没法解释。当然代码2和3按照这个逻辑是可以解释的。还有代码1的swap函数里的间接调用
和代码3的直接调用这样有区别吗?
...全文
744 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frank-1 2021-06-23
  • 打赏
  • 举报
回复

还是不太懂呀

Heessy 2015-11-18
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
[quote=引用 2 楼 Heessy 的回复:] =.=茅厕蹲开~~~!,那么代码1里面是不是要理解为这个函数将实参所指向的内存里面的内容发生交换?而代码2只是形参所拥有 的地址发生交换,并没有什么卵用??
是的,代码1中 实参与形参(指针)的地址是不同的,但所指的内容是相同的 代码2 实参与形参(指针)的地址是不同的,交换形参没什么用[/quote] 66666666666茅厕蹲开,愁了我一晚上,总觉得是哪里不对,现在终于想明白了。
paschen 2015-11-18
  • 打赏
  • 举报
回复
引用 2 楼 Heessy 的回复:
=.=茅厕蹲开~~~!,那么代码1里面是不是要理解为这个函数将实参所指向的内存里面的内容发生交换?而代码2只是形参所拥有 的地址发生交换,并没有什么卵用??
是的,代码1中 实参与形参(指针)的地址是不同的,但所指的内容是相同的 代码2 实参与形参(指针)的地址是不同的,交换形参没什么用
初生牛犊_GDUT 2015-11-18
  • 打赏
  • 举报
回复
代码1在功能函数中是对指针所指向的栈地址中所存储的值进行操作,该地址的值是个主函数中的变量,除了主函数结束,不然值不会销毁,故能达到交换的效果,代码二和代码三是对功能函数的变量(形参的值)进行操作,待功能函数结束后即销毁。
Heessy 2015-11-18
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
代码2与3都不会达到交换,因为你形参只是实参的一个副本,交换的只是一个复制后的数,然后函数结束时就清除了 代码1中形参是实参的一个副本,但他们所指向的内存确是同一个地方,所以可以达到交换
=.=茅厕蹲开~~~!,那么代码1里面是不是要理解为这个函数将实参所指向的内存里面的内容发生交换?而代码2只是形参所拥有 的地址发生交换,并没有什么卵用??
Heessy 2015-11-18
  • 打赏
  • 举报
回复
=.=茅厕蹲开~~~!,那么代码1里面是不是要理解为这个函数将实参所指向的内存里面的内容发生交换?而代码2只是形参所拥有 的地址发生交换,并没有什么卵用??
paschen 2015-11-18
  • 打赏
  • 举报
回复
代码2与3都不会达到交换,因为你形参只是实参的一个副本,交换的只是一个复制后的数,然后函数结束时就清除了 代码1中形参是实参的一个副本,但他们所指向的内存确是同一个地方,所以可以达到交换

69,381

社区成员

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

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