【问题标题】:Which type should I use for a pointer ? ptrdiff_t or void*?我应该使用哪种类型的指针? ptrdiff_t 还是 void*?
【发布时间】:2012-04-11 15:00:12
【问题描述】:

哪一行是定义指针​​的正确(最佳)方式?

typedef ptrdiff_t pointer; // pointers are ptrdiff_t.

          -- or --

typedef void* pointer; // pointers are void*.


pointer ptr = malloc(1024);

【问题讨论】:

  • void *ptr = malloc(1024); :)

标签: c pointers c89


【解决方案1】:

C 中的指针是T* 类型,其中T 是指向的类型; void* 是通用指针类型。通常,您让 C 隐式地将 void* 转换为有用的东西,例如

char *buffer = malloc(1024);

ptrdiff_t是两个指针相减返回的类型,例如

ptrdiff_t d = write_ptr - buffer;
// now you know the write_ptr is d bytes beyond the start of the buffer

ptrdiff_t是整数类型,不是指针类型;您不能在其上使用间接运算符*。 (顺便说一句,你也不能在 void* 上有意义地使用它。)

如果您想以整数类型存储指针,uintptr_t 会比较合适。

【讨论】:

    【解决方案2】:

    声明指针的最佳方式是

    T *ptr;
    

    其中T 是指向的基本类型——intcharstruct foo,等等。 malloc 返回一个void *,它被隐式转换为目标指针类型,因此以下所有内容都同样有效:

    char *str = malloc(512);                       // allocates space for 512 chars
    int *arr = malloc(sizeof *arr * 512);          // allocates space for 512 ints
    struct foo *farr = malloc(sizeof *farr * 512); // allocates space for 512 struct foos
    int (*arr2)[10] = malloc (sizeof *arr2 * 512); // allocates space for 512x10 ints
    

    等等等等等等

    C 中没有 single 指针数据类型;有多种“指向T”的数据类型。指针运算取决于基类型; str + 1 将产生与arr + 1 不同的值,这将产生与farr + 1 不同的值,等等。void * 是“通用”指针类型,但您不想要对所有内容使用通用指针。

    不要在 typedef 后面隐藏指针类型,除非指针类型是不透明的并且永远不会被取消引用,即使这样通常也是一个坏主意。

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2014-11-30
      • 2018-12-16
      • 2012-05-28
      相关资源
      最近更新 更多