Распространенное использование для указателей? - PullRequest
9 голосов
/ 27 января 2010

Я студент по программированию с двумя классами в C #, но я просто беру свой первый класс в C ++, и, таким образом, я подвергаюсь воздействию указателей.

Я знаю, как они работают, и как правильно их использовать, но меня интересует, как профессиональные программисты используют указатели в своих программах.

Так как вы используете указатели? Или ты?

Это поможет мне понять некоторые практические приложения для указателей, так что спасибо!

Ответы [ 4 ]

18 голосов
/ 27 января 2010

Каждый раз, когда вы используете ссылку в C #.«Ссылка» - это просто указатель с необычными подушками безопасности вокруг него.

Я использую указатели примерно каждые шесть строк в коде C ++, который я пишу.Вдобавок ко всему, это наиболее распространенное использование:

  • Когда мне нужно динамически создать объект, срок жизни которого превышает область, в которой он был создан.
  • Когда янужно выделить объект, размер которого неизвестен во время компиляции.
  • Когда мне нужно передать право собственности на объект от одной вещи к другой, фактически не копируя его (как в связанном списке / куче / что-либо действительно большого, дорогие структуры)
  • Когда мне нужно сослаться на один и тот же объект из двух разных мест.
  • Когда мне нужно нарезать массив, не копируя его.
  • Когда мне нужно записать напрямую в определенную область памяти (потому что у нее есть отображенный в память ввод-вывод).*
6 голосов
/ 27 января 2010

Для статтеров вы используете их в своих структурах данных , таких как связанный список и т. Д. В любом месте, где вам требуется динамически выделяемая память, то есть память, размер которой вы не знаете во время компиляции , вы будете использовать указатель .

1 голос
/ 27 января 2010

Часть 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, предоставленным сторонней организацией, когда требуется предоставить указатель на функцию.

1 голос
/ 27 января 2010

Если у вас есть время для чтения книги, я бы порекомендовал прочитать Язык программирования C , который интенсивно использует указатели.

Простой пример стандартной функции:

/* strlen: return length of string s */
int strlen(char *s) {
    char *p = s;
    while (*p != '\0') p++;
    return p - s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...