Ниже приведен фрагмент использования указателей,
Car obj;
Car *p_Obj = &obj;
Car **pp_Obj = &p_obj;
obj
- простой объект, в котором хранится содержимое. p_Obj
- указатель, указывающий на область памяти obj
pp_Obj
- указатель на указатель на obj
Короче говоря,
Теперь перейдем к вашему случаю,
Car cars1_[numCars];
Car * cars2_;
Car * cars3_[numCars];
Car ** cars4_;
cars1
- массив объектов. Как вы указали, к отдельному объекту можно получить доступ как cars1_[0].fun()
cars2_
- указатель на объект или массив объектов. назначается или обновляется, как указано ниже,
Car cars1_;
Car * cars2_ = &cars1_;
cars2_ -> fun();
// or
Car cars1_[numCars];
Car * cars2_ = cars1_;
cars2_[0].fun();
cars3_
- это массив указателей на объект или массив объектов
Car cars11_{10};
Car cars12_[4]{20,30,40};
Car * cars2_[4] = { &cars11_,&cars12_[0] };
cars2_[0]->fun(); //access cars11_
(cars2_[1]+0)->fun(); //access cars12_[0]
(cars2_[1]+1)->fun(); //access cars12_[1]
(cars2_[1]+2)->fun(); //access cars12_[2]
//or
cars2_[1][0].fun(); //access cars12_[0]
cars2_[1][1].fun(); //access cars12_[1]
cars2_[1][2].fun(); //access cars12_[2]
cars4_
- указатель на указатель на объект или указатель на массив указателей на объект или указатель на указатель на массив объекта
Car cars11_[4]{10,20,30};
Car *cars12_= &cars11_[0];
Car **cars4_ = &cars12_;
(*cars4_)[0].fun(); //access cars11_[0]
(*cars4_)[1].fun(); //access cars11_[1]
(*cars4_)[2].fun(); //access cars11_[2]
//or
cars4_[0][0].fun(); //access cars11_[0]
cars4_[0][1].fun(); //access cars11_[1]
cars4_[0][2].fun(); //access cars11_[1]