指针的常见用途?

时间:2010-01-27 05:07:10

标签: c++ pointers

我是一名编程学生,在C#中有两个班,但我只是在C ++中学习第一堂课,因此我接触到指针。

我知道它们是如何工作的,以及使用它们的正确方法,但我想知道专业程序员在程序中使用指针的一些方法。

那么你如何使用指针?或者你呢?

这将帮助我理解指针的一些实际应用,谢谢!

4 个答案:

答案 0 :(得分:18)

任何时候你在C#中使用引用。 “参考”只是一个指针,周围有安全的安全气囊。

我在我编写的C ++代码中每六行使用一次指针。在我的脑海中,这些是最常见的用途:

  • 当我需要动态创建一个寿命超过创建范围的对象时。
  • 当我需要在编译时分配一个大小未知的对象时。
  • 当我需要将一个对象的所有权从一个东西转移到另一个东西而不实际复制它时(比如链接列表/堆/任何非常大的,昂贵的结构)
  • 当我需要从两个不同的地方引用同一个对象时。
  • 当我需要切片而不复制它时。
  • 当我需要直接写入特定的内存区域时(因为它有内存映射的IO)。

答案 1 :(得分:6)

对于状态器,你可以在你的data structures中使用它们,比如链表等。你需要动态分配内存的地方,也就是你不知道编译时大小的内存,你会使用pointer

答案 2 :(得分:1)

如果你有时间阅读一本书,我建议阅读The C Programming Language,这会大量使用指针。

标准函数的一个简单示例:

/* strlen: return length of string s */
int strlen(char *s) {
    char *p = s;
    while (*p != '\0') p++;
    return p - s;
}

答案 3 :(得分:1)

第1部分,第2部分

当需要将数据传递到现有API时,通常需要指针与C库接口。这种机制不仅限于“遗留”系统,现代示例包括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的方法。