指针遍历和数组遍历

举例说明:关于Shape*shapes[3] 类型解析与遍历

Shapeshapes[3]是一个包含三个指Shape对象的指针的数组。

类型分析

  • shapes 的类型是Shape*[3],即一个包含3个Shape指针的数组
  • 每个元素(shape[0],shape[1],shape[2])的类型是Shape*

遍历方法

1.数组遍历(使用下标)

for(int i=0;i<3;i++){
 Shape*shape=shapes[i];
if(Shape!=nullptr){
 shape->draw();
 }
}

2.指针遍历(使用指针算法)

for (Shape**ptr =shapes;ptr!=shapes+3;ptr++){
Shape*shape*ptr;
if(shape!=nullptr){
shape->draw();
 }
}

两种遍历方法的区别

特性 数组遍历 指针遍历
语法 使用下标操作符[] 使用指针算术和解引用
可读性 通常更直观 对初学者可能较难理解
灵活性 固定使用数组下标 可以灵活地操作指针
适用场景 已知数组大小的简单遍历 需要更复杂指针操作场景

指针数组的遍历 VS 指针遍历的区别

1.数组遍历(inbox -Based Traversal)

·特点:通过数组小标[i]访问每个指针,再解引用获取值。
·使用场景:已知数组长度,需要随机访问(ptrArr[2]).
·缺点:需要维护索引变量,无法直接利用指针的可移动特性。

2.指针遍历(Pointer Arithmetic Travertaic)

·特点:直接操作指针(如 ptr++或*(ptr+i)),通过地址偏移访问数据;
·适用场景:动态内存,连续存储的数据(如字符串,动态数组;
·优点:更高效(减少索引计算),适合未知长度的数据;
·缺点:容易越界,需要手动管理指针位置;

代码对比

(1)数组遍历(Index-Based)

int a=10,b=20,c=30;
 int *ptrArr[3]={&a,&b,&c};//指针数组
//数组遍历:通过索引访问指针,再解引用
for (int i=0;i<3;i++){
cout<<*ptrArr[i]<<"";//输出:10,20,30
}

(2)指针遍历(Pointer Arithmetic)

int a=10,b=20,c=30;
int*ptrArr[3]={&a,&b,&c};
int **ptr=ptrArr;//指向指针数组的指针
for(int i=0;i<3;i++){
cout<<**(ptr+i)<<"";
}
//指针自增
int **ptr2=ptrArr;
while(ptr2<ptrArr+3){
cout<<**ptr<<"";
ptr++;
}

关键区别总结

方式 访问方法 性能 安全性
数组遍历 ptrArr[i]+* 一般 高(不易越界)
指针遍历 ptr++或*(ptr+i) 更高 低(需防越界)
posted on 2025-06-08 16:03  OucPency  阅读(12)  评论(0)    收藏  举报