本文主要介绍了C/C知识点的C语言存储器地址交换,希望通过具体内容对C/C知识点的学习有所帮助。 C语言课很无聊。 因为以前学过C#,所以很无聊。
但我只能说我见过,不能表示我理解。
特别是这个地址交换。 但是我想做一个排序比例算法,里面有一个Swap函数,比较两个个数的大小,保证形参a永远大于形参b,里面正好用了地址交换。
那个时候错了,没有任何效果。为了完成那个工作,我马上重构了一次,把地址交换变成了价格交换。
今天上课正好那个时候赶紧换了代码,但是遇到了没有好好考虑的问题。也就是地址交换无效的问题。
回顾一下当时的处境:
1voidswap(int*a,int*b ) )。
2{
3//swap函数作为一个数据交换函数,完成a、b两个个数的大小比较
4//ba的话交换地址,使左边总是大于右边
5if(*a*b ) ) ) ) ) ) ) )。
6{
7int*c=a;
8a=b;
9b=c;
10}
11//在此完成地址交换
12}
但是,结果不会改变。 例如,传递的变量a=12,b=13。 结束后,a仍然是12,b仍然是13。
当时因为时间问题没有深究,现在老师给了我们同样的问题,这样就暴露了我什么都不知道。
接下来是老师上课的代码。
1voidswap(int*a,int*b ) )。
2{
3int*temp=a;
4a=b;
5b=temp;
6}
同样,地址交换成功,从swap函数体弹出时,全部恢复了原状
这个时候要自己找问题(其实老师在课上已经说过了,但我不打算听。 自己的身体里充满了恶作剧,试图自己实践)。
根据代码的效果反馈,选择了添加断点;
上图显示当前变量a的值为0x004ffa5c,变量b的值为0x004ffa50。 这是交换前的东西。
这里的地址变了。 但是,让我们来看看总体结果
看到这里,我有点绝望了。 地址的数量没有变化。
其原因是什么呢?
请看上面我特意输出的3、4行。
这里一切都清楚地表明了。 让我们先了解一下:
也就是说,我们操作的不是变量实体,这里是详细的模型
根据图例,指针保存着地址。 这里的地址可以是类的地址、函数的地址、指针的地址.我们在*中操作的值,实际上是找到与指针的值对应的物理地址进行操作。
这里有两个结论:
1、指针只能操作一个变量实体的值,不能操作变量实体的地址!
2、形参值不能传递给实参(仅验证) )。
今天的随笔可能很难想。 因为我没有说明这样写代码的理论依据,因为各种原因思路不明确,所以不打算写得太详细
老师在课上教了我们。 这里实际上是对自己推理的验证。 这里的论证思路请读者推敲一下吧
本文将职务坐标整理发布,希望对同学们有所帮助。 详情请关注职位坐标编程语言C/C通道!