C语言中使用指针填充数组求助(禁止使用下标访问)
问题分析与解决
你的代码核心问题是误用了二级指针,导致指针操作完全偏离了数组内存区域。
为什么原来的代码只修改了第一个元素?
函数参数int *arr已经是指向数组首元素的一级指针,你却取它的地址赋值给二级指针int **elementOfArray = &arr;——这里的&arr指向的是函数栈帧里的arr参数变量本身,不是数组的内存。当你递增elementOfArray时,其实是在遍历栈上的其他局部变量内存,完全和数组无关,只有第一次赋值能碰巧修改到数组首元素,后续操作都是在修改无关内存。
修正后的基础填充代码(用一级指针)
直接用一级指针操作数组即可,不需要二级指针:
#include <stdio.h> #define MAX_SIZE 10 void initializeArray(int *arr) { int *elementOfArray = arr; // 让指针指向数组首元素 for (int i = 0; i < MAX_SIZE; ++i) { *elementOfArray = 22; // 解引用指针,给当前元素赋值 elementOfArray++; // 指针向后移动一个int大小的位置,指向数组下一个元素 } } int main() { int arr[MAX_SIZE]; initializeArray(arr); // 数组名本身就是首元素指针,直接传递即可 // 打印验证 int *printPtr = arr; for (int i = 0; i < MAX_SIZE; ++i) { printf("%d ", *printPtr); printPtr++; } return 0; }
满足作业要求:无重复随机数填充(仅用指针)
用Fisher-Yates洗牌算法生成无重复随机数,全程不使用下标[i]:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_SIZE 10 void fillUniqueRandom(int *arr) { // 第一步:填充0到MAX_SIZE-1的有序序列 int *ptr = arr; for (int i = 0; i < MAX_SIZE; ++i) { *ptr = i; ptr++; } // 第二步:Fisher-Yates洗牌,生成无重复随机数组 srand((unsigned int)time(NULL)); ptr = arr + MAX_SIZE - 1; // 指向数组最后一个元素 for (int i = MAX_SIZE - 1; i > 0; --i) { int randomPos = rand() % (i + 1); // 交换当前指针指向的元素和随机位置的元素 int temp = *(arr + randomPos); *(arr + randomPos) = *ptr; *ptr = temp; ptr--; // 指针向前移动一位 } } int main() { int arr[MAX_SIZE]; fillUniqueRandom(arr); // 指针遍历打印结果 int *printPtr = arr; printf("生成的无重复随机数组:"); while (printPtr < arr + MAX_SIZE) { printf("%d ", *printPtr); printPtr++; } printf("\n"); return 0; }
关键指针操作说明
- 数组名
arr传递给函数时,会自动转换为指向首元素的一级指针,无需额外取地址。 ptr++:指针向后移动一个int的大小(因为指针类型是int*),正好指向数组的下一个元素。arr + n:指针加法,直接计算出数组第n个元素的地址(等价于&arr[n],但这里没有使用下标)。
内容的提问来源于stack exchange,提问作者Ricardo Roel
相关产品推荐
相关产品推荐

