如何让数组指针每次进入for循环时指向数组起始位置?
如何让指针每次进入for循环都指向数组起始位置?
问题背景
主程序中初始化数组并将指针传入函数,函数需要多次执行for循环,要求每次循环都从数组起始位置(array[0])开始遍历。需求是:找到指定数量的0并改为1,返回这些0的索引总和,必须通过函数实现。实际场景中需要重复执行循环直到满足特定条件,示例代码如下:
int function(int *pointer){ int count = 3, sum = 0; //修改数组后,仍有多于3个位置为0 while(count != 0){ for(int i = 0; i < 10; i++){ if(*(pointer + i) == 0){ sum+=i; *(pointer + i) = 1; } } } return sum; } int main(void){ int array[10] = {0}; int sum = function(array); printf("%d", sum); return 0; }
之前尝试用int temp = pointer保存起始地址,但count≥3时失效;尝试从上次找到的索引开始遍历,也无法准确找到所有0。
问题分析
- 地址保存错误:用
int类型变量存储指针地址是错误的——64位系统中指针占8字节,int仅占4字节,会导致地址截断丢失,必须用指针类型保存起始地址。 - 循环无终止逻辑:原代码的
while循环没有在找到0时减少count,会陷入无限循环。 - 原代码中
pointer本身并未被修改,其实每次for循环的*(pointer + i)本来就是从数组起始位置访问,但你的尝试错误地修改了指针位置,导致偏移。
正确实现代码
#include <stdio.h> int function(int *pointer) { int count = 3; int sum = 0; // 用指针变量保存数组起始地址,确保每次遍历都从开头出发 int *start_ptr = pointer; while (count > 0) { for (int i = 0; i < 10; i++) { // 基于起始指针访问数组元素,每次循环都从array[0]开始 if (*(start_ptr + i) == 0) { sum += i; *(start_ptr + i) = 1; count--; // 找够数量后直接退出循环,避免无效遍历 if (count == 0) break; } } } return sum; } int main(void) { int array[10] = {0}; int sum = function(array); printf("索引总和:%d\n", sum); // 验证数组修改结果 for (int i = 0; i < 10; i++) { printf("%d ", array[i]); } return 0; }
核心要点
- 固定起始指针:用
int *start_ptr = pointer;保存数组首地址,后续所有数组访问都基于这个指针,确保每次循环都从数组开头开始,不会因为误操作原指针导致偏移。 - 完善终止条件:每找到一个目标元素就减少计数,计数归0时立即退出循环,避免不必要的遍历。
- 针对你实际的复杂场景,只要保持每次遍历都基于保存的起始指针,就能稳定从数组开头执行循环,满足重复遍历的需求。
内容的提问来源于stack exchange,提问作者Not So Witty Kitty
相关产品推荐
相关产品推荐

