C语言 第八题函数值为什么不变呀你没有理解输出的是什么
输出的*p,*q,指的是*p,*q对应内存地址的值,而不是p,q本身的值
虽然p,q在main过后互换了值,但对应地址指向的值是不变的 。
也就是说其实main过后*p=j,*q=i
明白了吗?
我特意跑了下这个程序,顺便输出了*p,*q对应的地址供你加强理解 。
c语言指针问题 。被传进去的a指向b为什么到主函数地址内内容不变?fun传过去的时候值用的是a数组里的值 。是地址1
但是在子函数里面调用p的时候,子函数不会直接用a数组的地址,而是重新开辟一个地址 。是地址2.
然后子函数中又重新定义了一个b数组 。是地址3.
然后 。p=b 。就说把地址3的值赋给地址2.到此子函数结束 。
然后printf的是a数组的值 。也就是地址1的值 。所以还是ABCDE 。并没有发生改变
c语言在子函数中给形参赋值,为什么主函数中的形参值却不变?简单理解为main给f1传参数时 , 把a、b、c复制了一份 。f1里的abc与main里的abc虽然长得一样,但只是克隆体
C语言中 , 为什么有的输出结果主函数的值不变?。?我有点迷看来你的C语言功底要加强一下了,说笑的?。。?
在函数里调用另一个函数fun,要使用指针的方式才能改变它的值,如fun(int *x, int *y);
如果不使用指针而直接值传递调用,那么在调用完fun函数后,该函数做占用的内存、堆栈都会被释放,即a、b的值还是以前的,不会被改变;
使用指针的话,它会直接修改指针所指向的内存的值(const除外) , 从而达到交换的目的 。
C语言,指针 , 函数 为什么在函数中改变了指针主函数依旧不变? 书上给的看不是太懂C++可以通过异常处理的throw和catch来实现从子函数的子函数直接返回主函数,汇编语言可以用jmp指令跳转实现这个需求 。C语言主要靠函数调用和return在函数之间切换,很难做到在多层调用中直接返回主函数 。虽然goto语句可以无条件跳转,但是必须在同一个函数中使用 。因此解决的方法也是用一个特殊的值作为需要返回的标志,然后在两层调用函数中都遇到该值就返回,但是这个方法也有两个前提:1)你的两个子函数都是由返回值的函数2)你选择的特殊值和函数正常的返回的取值不会冲突,不会引起二义性 。因此建议你的这个问题还是用C++ 的异常去解决比较好 。
C语言中函数调用,为什么交换了地址,可是所指的值还是不变那????#includestdio.h
void swap(int *a,int *b)
{
int t=0;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int x=3,y=5;
int *p=x,*q=y;
swap(p,q);
printf("%d %d\n",*p,*q);
printf("%d %d\n,a,b);//看看是不是 a,b也改变了!~!
}
你那个错误,我的估计: 你可以用vc++单步调式一下.也可以完全理解的.
p=x就是把x的地址保存在 指针 p中.*p 就是得到值. *p=3.
q也差不多.
你下面sqap(p,q) . 就是把地址传过去了.
可是传回来的值没有改变,为什么呢!
【c语言中主函数的值不变 c语言函数主函数】原因很简单.
因为你的
int *t;
int*t;
t=a;a=b;b=t;
交换的是a和b 的地址.
不要忘记了,当调用一个函数时.
os会为swap 函数中的int *a,int *b.开辟内存.
你改变的是swap开辟的内存.并没有改变 main中的*p和*q内存区域.
我再说清楚点.
p 保存的是 aq保存的是b
swap函数a 保存的也是 ab保存的也是b
你用交换了 a和b的 地址.有什么用.没有改变原来的地方的地址.
只是改变了你自己的 a 和 b里面的地址.没有改变那边的 真正的3 和 5.
推荐阅读
- 有什么好玩的竞速pc游戏,好玩的竞速游戏电脑
- 安卓安装包制作ios软件,安卓安装包制作ios软件下载
- 游文慧区块链集团,游文程简介
- java项目意见反馈代码,java项目异常处理
- 勒让德函数python 勒让德函数pncos等于什么
- u盘怎么免费修复,免费的u盘修复
- sap删除运输单,sap销售订单删除凭证不能删除
- python做三维函数图 python三维数据处理
- vm虚拟机登录后如何操作,vm虚拟机怎么登录