为何我的运行结果是这样的?

我主要是想用指针和函数实现两个数组的交换,大家看看怎么回事,怎么改正呢?

img

img

先上结果:

img

首先,你这个数组已经交换了的,当然你这个我是看不懂的,因为你的a数组里面放的是123但是你按顺序输出的却是323我没有发现原因,但是我按你的这个方法执行了一遍,我发现他是可行的,你看我上面的结果,a[0]和a[1]输出之后你可以看到a数组第一个数是5,是b数组的第一个数字,他交换了的,但是为什么只交换了第一个数字呢?,这里要说一下数组名可以代表什么,数组名首先肯定能指代这个数组,但实际上他是一个指针,指向了第一个元素的首地址,所以你输出*a的时候,是可以输出a数组的第一个元素的,

img

但是他跟普通指针不同的区别就在于他不能修改,所以你不能进行*(a++)的操作,这是不被允许的,怎么思考这个问题呢,你可以想,如果数组的首地址向后移了一位,那你是不是就丢失了一位数据了,你就不能通过数组指针找到原来的那个数了,你可能会说,那再减减不完了,那我只能说,别抬杠,人就这么要求的,可能就不想你乱改数组首地址,这样安全一点,哈哈哈,就当个概念记住得了
言归正传,为什么只改变了第一个数据呢,你看你函数的形参写的是int a[],这个就是说你要传入一个指针(刚说了数组名是个指针),然后你把a和b传进去之后,你再函数里面交换的a和b上面的图也告诉你了,你交换了两个数组的第一个元素,然后swap函数结束后形参释放,然后数据还是交换了,因为你交换的是指针指向的单元,指针释放之后,那他指向的单元还是不动的对不,所以才造成了你现在只交换了第一个数据的局面,当然你要想交换每个元素采用这个方法也可以,

img

你能懂这个方法的意思吗?就是说你得再写个循环,把这两个数组一个个遍历交换才行,当然我觉得那这个就跟你直接用个循环交换是一样的,就完全没有必要,我下面说个方法,是用二级指针:

img

为什么要用二级指针呢,首先你要知道,数组名这个指针,你只有使用权没有修改权(上面说的),所以你要想修改你就只能把他放到另一个指针里去,通过操作这个指针来达到使用数组名的效果,但是实际上数组是没有改变的,你看,我先把数组名强转成一级指针给s,然后将s的地址传入数组,这个时候这个**a是个二级指针,而我们的s是个一级指针,根据函数结束释放形参的原则,实际上你修改s之后形参释放之后是不会影响结果的,这个你好好体会一下,不行了自己编写一点程序看看,这里我就说个大概,你看你能理解不,如果你想了解,可以私聊我,所以我就通过一个二级指针把两个数组的内容“交换”了,你试着体会一下如果有问题可以私聊我