C语言中使用指针符号遍历自动分配长度的数组时如何终止循环
核心问题解答
- 首先纠正语法误区:C语言中数组名是不可修改的左值,你无法直接执行
array++操作,需要先将数组地址赋值给独立的指针变量再做遍历操作,示例:int *p = array; - 数组末尾后第一个位置仅保证指针本身的算术操作、比较操作合法,不存在任何固定的可用于判断终止的特殊值:该位置的内存内容是未定义的,禁止解引用读取,其值不恒定,和数组类型没有任何关联,绝对不能通过读取该位置的内容作为循环终止条件。
合法的指针遍历终止方案
方案1:编译期计算数组长度做边界比较
你当前使用的是初始化时由编译器自动推导大小的栈数组,在数组名未退化为指针的作用域内,可以直接通过sizeof(array) / sizeof(array[0])计算得到数组总长度,再用尾指针做比较终止循环,这是最常用的无性能损耗的方案,示例代码:
int array[] = {2,3,4,5,6,7,8}; // 计算数组总长度,该值为编译期常量 int *end = array + sizeof(array) / sizeof(array[0]); for (int *p = array; p != end; p++) { // 遍历逻辑,p等于end时自动终止,end就是C标准保证合法的尾后指针 printf("%d ", *p); }
注意:该方案仅在数组定义的同一作用域内有效,如果数组作为参数传入函数,数组名会退化为指针,
sizeof(数组参数)得到的是指针本身的大小而非数组总大小,此时需要把数组长度作为参数同步传入函数。
方案2:手动设置哨兵值终止
如果无法提前获取数组长度,可以主动约定一个业务场景中不会出现的特殊值作为数组末尾的哨兵,遍历到哨兵值时终止,示例:
// 约定-1为哨兵值,代表数组结束 int array[] = {2,3,4,5,6,7,8, -1}; int *p = array; while (*p != -1) { printf("%d ", *p); p++; }
内容的提问来源于stack exchange,提问作者jk93117
相关产品推荐
相关产品推荐

