指针遍历和数组遍历
举例说明:关于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) | 更高 | 低(需防越界) |