You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何通过指针交换后数组首尾元素也发生了交换?

关于指针操作数组后数组元素变化的疑问解答

嘿,很高兴看到你开始上手指针啦!先给你确认下:指针的本质确实是存储另一个变量的内存地址,你的这个理解完全没错~

你之所以困惑“打印数组时没用到指针,但元素也交换了”,核心原因是:你用指针操作的,本来就是数组元素所在的内存空间,修改指针指向的内容,本质就是直接修改数组元素本身。

具体结合你的代码分析:

首先,在main函数里:

  • swap1 = arr;:数组名arr在这种场景下会被隐式转换成指向数组第一个元素arr[0]的指针,所以swap1现在存储的是arr[0]的内存地址。
  • swap2 = &arr[size-1];:这行直接取了数组最后一个元素arr[5]的地址赋值给swap2。

然后看swap函数:
你在函数里执行了*swapptr = *swapptr2;和*swapptr2 = temp;——这里的*swapptr就是对指针swapptr指向的内存地址进行赋值操作,而swapptr指向的正是arr[0]的地址;同理*swapptr2操作的是arr[5]的地址。也就是说,你这两行代码其实就是直接把arr[0]和arr[5]所在内存里的值做了交换,数组自然就跟着改变了。

另外提个小细节:你swap函数里的swapptr = arr;其实是冗余的,因为调用函数时已经把指向arr[0]的swap1传进来了,这行代码不会影响最终结果,但可以去掉让代码更简洁。

简单总结下逻辑:

数组的元素是存放在一段连续的内存空间里的,指针指向的就是这些内存位置。当你通过指针修改*指针变量的值时,就是直接修改对应内存地址里的内容——而这些内存地址正好是数组元素的存储位置,所以不管你是用指针访问,还是直接用arr[i]访问数组,看到的都会是修改后的结果。

附上你的代码(方便对照):

#include <iostream>
#include <ctime>
using namespace std;
void swap(int* swapptr, int arr[], int* swapptr2, int size);
int main() {
 int size;
 int arr[] = { 1,2,3,4,5,6 };
 int* swap1, * swap2;
 size = 6;
 swap1 = arr;
 swap2 = &arr[size-1];
 cout << "The value of the first element is " << *swap1 << " and second element is " << *swap2 << " \n \n";
 swap(swap1, arr, swap2, size);
 cout << "After swap the value of first is " << *swap1 << " and second is " << *swap2 << "\n \n ";
 for (int i = 0; i < size; ++i) {
 cout << arr[i] << " ";
 }
}
void swap(int* swapptr, int arr[], int*swapptr2, int size) {
 int temp = arr[0];
 swapptr = arr;
 *swapptr2 = arr[size-1];
 *swapptr = *swapptr2;
 *swapptr2 = temp;
}

内容的提问来源于stack exchange,提问作者Jos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:38:10