Я - студент программирования с двумя классами в C#, но я просто посещаю свой первый урок в C++, и таким образом я подвергаюсь указателям.
Я знаю, как они работают, и надлежащий способ использовать их, но я задался вопросом о некоторых способах, которыми профессиональные программисты используют указатели в своих программах.
Таким образом, как Вы используете указатели? Или Вы?
Это поможет мне понять некоторое практическое применение для указателей, так Спасибо!
В любое время вы будете использовать ссылку в C #. «Ссылка» - это просто указатель с модными безопасными подушками безопасности вокруг него.
Я использую указатели примерно раз каждые шесть линий в C ++, который я пишу. В верхней части моей головы это наиболее распространенные виды использования:
Для статоров вы используете их в ваших структурах данных , таких как связанный список и т.д. В любом месте, где Вам нужна динамически выделяемая память, т.е. память, размер которой Вы не знаете во время компиляции, Вы будете использовать указатель .
Если у вас есть некоторое время на ваших руках для чтения книги, я бы порекомендовал прочитать язык программирования C , который делает тяжелое использование указателей.
Простой пример стандартной функции:
/* strlen: return length of string s */
int strlen(char *s) {
char *p = s;
while (*p != '\0') p++;
return p - s;
}
Часть 1 из 2
Указатели часто требуются для взаимодействия с библиотеками C, когда данные должны быть переданы в существующее API. Этот механизм не ограничивается «устаревшим» системами, современные примеры включают OpenGL, DirectX и Win32.
Ниже приведен пример от OpenGL: GLVERVEXPONTER (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, предоставленной третьей стороной при необходимости для предоставления указателя функции.