Часть 1 из 2
Указатели часто требуются для взаимодействия с библиотеками C, когда данные должны быть переданы в существующий API. Этот механизм не ограничивается «устаревшими» системами, современные примеры включают OpenGL, DirectX и Win32.
ниже приведен пример из OpenGL:
glVertexPointer (int, float, int, float *) принимает указатель с плавающей точкой в качестве первого аргумента.
GLfloat vertices[] = {...}; // 24 of vertex coords
...
// activate and specify pointer to vertex array
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
// draw a cube
glDrawArrays(GL_QUADS, 0, 24);
// deactivate vertex arrays after drawing
glDisableClientState(GL_VERTEX_ARRAY);
вместо использования статически определенного массива было бы нормально сделать следующее:
Glfloat *vertex = new GlFloat[24];
...
glVertexPointer(3, GL_FLOAT, 0, vertices);
...
delete [] vertex.
или если вы хотите использовать std :: vector
std::vector<Glfloat> vertex;
vertex.resize(24);
...
glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);
...
Часть 2 из 2
Указатели на объекты и указатели на функции полезны при определении статической функции-члена, которая должна работать с конкретным экземпляром класса. Эта идиома появляется в механизмах обратного вызова.
class foo {
...
public:
static int s_callback0(void* obj){
return (foo*)(obj)->callback0();
}
int callback0(){
...
}
...
};
class callbackAPI {
public:
int setCallback(int(*fn)(void*),void* context){
m_fn(fn);
m_context(context);
}
void run (){
m_fn(m_context);
}
private:
int(*m_fn)(void*);
void *m_context;
};
main {
foo f;
callbackAPI cb;
cb.setCallback(foo::s_callback0,f);
cb.run();
}
Если у вас есть контроль над callbackAPI, аналогичные результаты могут быть достигнуты с помощью наследования и шаблонов. Приведенные выше примеры демонстрируют способ работы с callbackAPI, предоставленным сторонней организацией, когда требуется предоставить указатель на функцию.