C语言中for循环直接使用指针的实现与疑问咨询
在for循环中直接使用C语言指针的正确方式
关于你第一段代码的观察优化
你给出的第一段代码本身是可正常运行的,它通过ptr++逐步遍历数组元素。如果想要直观观察ptr的地址变化和对应指向的值,只需在循环中添加打印指针地址的语句即可:
#include <stdio.h> #include <stdlib.h> int main(){ int x[10]={1,3,2,5,43,67,8,64,22,123}; int* ptr=x; for(int i=0;i<10;i++){ printf("ptr地址:%p,指向的值:%d\n", (void*)ptr, *ptr); printf("x[%d]的值:%d\n", i, x[i]); ptr++; } return 0; }
运行这段代码就能看到每次循环中ptr的地址递增(每次加4,因为int类型占4字节),以及它指向的数组元素值。
你尝试的第二段代码的错误修正
你尝试用指针替代循环索引i的思路是对的,但代码里有两个致命错误:
- 循环条件
ptr < 10非法:指针不能直接和整数比较,应该用指针与数组的末尾后地址对比,也就是ptr < x + 10(数组x有10个元素,x+10是最后一个元素的下一个内存地址,这是指针遍历的终止条件)。 - 循环内的
x[i]无定义:既然要完全用指针替代索引,就不需要再使用x[i],直接通过*ptr访问当前指针指向的元素即可。
修正后的正确代码如下:
#include <stdio.h> #include <stdlib.h> int main(){ int x[10]={1,3,2,5,43,67,8,64,22,123}; for(int* ptr = x; ptr < x + 10; ptr++){ printf("%d\n", *ptr); } return 0; }
如果需要同时观察指针地址和值,可修改为:
#include <stdio.h> #include <stdlib.h> int main(){ int x[10]={1,3,2,5,43,67,8,64,22,123}; for(int* ptr = x; ptr < x + 10; ptr++){ printf("指针地址:%p,对应值:%d\n", (void*)ptr, *ptr); } return 0; }
这种指针用法的可行性
这种直接用指针遍历数组的写法是完全可行的,而且是C语言中非常常见的用法。本质上,数组索引访问x[i]就是*(x + i)的语法糖,两种写法在底层是等价的,直接用指针遍历还能更直观地体现内存地址的操作逻辑。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

