关于c ++:指针的常用用途?

Common Uses For Pointers?

我是一个编程学生,在C语言中有两个班,但我刚上了C++的第一堂课,因此我正受到指针的影响。

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

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

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


任何时候使用C中的引用。"参考"只是一个指针,周围有漂亮的安全气囊。

我使用的指针大约是我写的C++代码中每六行的一个指针。从我的头顶上看,这些是最常见的用途:

  • 当我需要动态地创建一个生存期超过创建它的范围的对象时。
  • 当我需要分配一个在编译时大小未知的对象时。
  • 当我需要将一个对象的所有权从一个对象转移到另一个对象而不实际复制它时(就像在一个链表/堆/任何真正大的、昂贵的结构中一样)
  • 当我需要从两个不同的地方引用同一个对象时。
  • 当我需要切片一个数组而不复制它时。
  • 当我需要直接写入特定的内存区域时(因为它有内存映射IO)。


对于状态器,您可以在数据结构中使用它们,如链表等。任何需要动态分配内存的地方,即在编译时不知道大小的内存,都将使用指针。


第2部分第1部分

当数据需要传递到现有的API时,通常需要指针与C库进行接口。这种机制不局限于"遗留"系统,现代示例包括OpenGL、DirectX和Win32。

以下是OpenGL的一个示例:glvertexpointer(int,float,int,float*)将浮点指针作为第一个参数。

1
2
3
4
5
6
7
8
9
10
11
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);

不使用静态定义的数组,可以执行以下操作:

1
2
3
4
5
Glfloat *vertex = new GlFloat[24];
...
glVertexPointer(3, GL_FLOAT, 0, vertices);
...
delete [] vertex.

或者如果您想使用std::vector

1
2
3
4
5
std::vector<Glfloat> vertex;
vertex.resize(24);
...
glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);
...

第2部分第2部分

指向对象的指针和函数指针在定义需要在类的特定实例上操作的静态成员函数时很有用。这个习语出现在回调机制中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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,那么可以通过继承和模板实现类似的结果。上面的示例演示了在需要提供函数指针时使用第三方提供的回调API的方法。


如果您有时间阅读一本书,我建议您阅读大量使用指针的C编程语言。

标准函数的简单示例:

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