Общее использование для указателей?

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

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

Таким образом, как Вы используете указатели? Или Вы?

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

10
задан skaffman 30 June 2011 в 10:13
поделиться

4 ответа

В любое время вы будете использовать ссылку в C #. «Ссылка» - это просто указатель с модными безопасными подушками безопасности вокруг него.

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

  • , когда мне нужно динамически создавать объект, срок службы которого превышает объем, в котором он был создан.
  • Когда мне нужно выделить объект, размер которого неизвестен во время компиляции.
  • Когда мне нужно передать право собственности на объект из одного на другой, не копируя его (вроде в связанном списке / куче / что в самом целях действительно больших, дорогих структуров)
  • , когда мне нужно обратиться к одному и тому же объекту из двух разных мест.
  • Когда мне нужно нарезать массив, не копируя его.
  • Когда мне нужно писать непосредственно в определенный регион памяти (потому что он имеет память IO).
18
ответ дан 3 December 2019 в 16:09
поделиться

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

6
ответ дан 3 December 2019 в 16:09
поделиться

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

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

/* strlen: return length of string s */
int strlen(char *s) {
    char *p = s;
    while (*p != '\0') p++;
    return p - s;
}
1
ответ дан 3 December 2019 в 16:09
поделиться

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

1
ответ дан 3 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: