为何无法用指针替代数组下标取值定位?及指针地址交换疑问
指针替代数组下标排序的问题与交换方法解析
一、为什么你的指针替代下标代码报错?
指针完全可以替代数组下标,数组下标访问num[i]本质上等价于*(num+i),也等价于*(p+i)(其中p是指向num[0]的指针)。你的代码报错是因为两处明确错误:
函数声明与定义不匹配
你声明的函数是void Ascending_Swap();,但定义时参数为int *a, int *b,声明缺少参数类型,编译器无法正确识别函数参数要求。函数调用参数类型不匹配
调用Ascending_Swap(*(p+x-1), *(p+x));时,*(p+x-1)和*(p+x)是取指针指向的int值,但函数要求传入int类型的指针(地址)。正确的调用应该是传入元素的地址:Ascending_Swap(p+x-1, p+x);,因为p+x-1本身就是指向num[x-1]的指针。
修正后的核心代码片段:
// 修正函数声明 void Ascending_Swap(int *a, int *b); // 修正调用逻辑 Ascending_Swap(p+x-1, p+x);
二、交换指针的内存地址来替代值交换是否可行?
可行,但要明确你的目标差异:
- 如果目的是改变数组元素的实际存储顺序(即真正排序数组本身),这种方法没用。交换指针的地址只是让指针指向不同的数组元素,数组内元素的存储位置和值都不会改变,遍历原数组时顺序还是原样。
- 如果只是想改变指针访问元素的顺序,那可以这么做,但这不是真正意义上的数组排序。
交换指针地址的实现方法
要交换两个指针变量的指向,需要使用二级指针(指针的指针)来传递指针的地址:
#include <stdio.h> void Swap_Pointers(int **a, int **b) { int *temp = *a; *a = *b; *b = temp; } int main() { int num[2] = {10, 20}; int *ptr1 = &num[0]; int *ptr2 = &num[1]; printf("交换前:ptr1指向%d,ptr2指向%d\n", *ptr1, *ptr2); Swap_Pointers(&ptr1, &ptr2); printf("交换后:ptr1指向%d,ptr2指向%d\n", *ptr1, *ptr2); // 注意:num数组元素的顺序还是[10,20],只是指针指向变了 return 0; }
补充说明
如果你的目标是排序数组元素,还是要通过交换指针指向的值(也就是你原来Ascending_Swap函数的逻辑,修正调用方式即可),而不是交换指针本身的地址。
内容的提问来源于stack exchange,提问作者Coderey123
相关产品推荐
相关产品推荐

