为何通过指针交换后数组首尾元素也发生了交换?
关于指针操作数组后数组元素变化的疑问解答
嘿,很高兴看到你开始上手指针啦!先给你确认下:指针的本质确实是存储另一个变量的内存地址,你的这个理解完全没错~
你之所以困惑“打印数组时没用到指针,但元素也交换了”,核心原因是:你用指针操作的,本来就是数组元素所在的内存空间,修改指针指向的内容,本质就是直接修改数组元素本身。
具体结合你的代码分析:
首先,在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
相关产品推荐
相关产品推荐

