为什么以及何时应该在C中使用指针指针而不是简单的指针?

时间:2016-10-31 06:31:50

标签: c pointers

我理解指针的指针是如何工作的,但我无法理解为什么使用指针指向简单指针,以及在 C编程中使用它们时(不是C ++) )。我已经阅读了很多关于它的帖子,但我找不到令人满意的答案。我见过的所有例子都可以变成一个单级指针解决方案。有人可以给出一个简单的例子,其中指针的指针是“强制性的”(用简单的指针无法完成)吗?

2 个答案:

答案 0 :(得分:3)

简单的情况是您想要修改指针本身。例如,

void func(char **p)
{
   *p = malloc(1024); / allocate 1024 bytes */
}

int main(void)
{
   char *p = NULL;
   func(&p);
   /* Now, p points at memory block of 1024 bytes and do something with it */

   return 0;
}

当然,可以通过其他方法进行内存分配,例如从函数等返回指针。但这是指向指针的一种方法。

答案 1 :(得分:2)

你可能看到的第一个例子是

int main ( int argc, char **argv )

在这种情况下,argv是一个“参差不齐”的二维数组,也就是说,数组的每一行都存储一个指向不同大小的一维数组的指针。

另一个常见的情况是到目前为止其他人都提到的:你希望函数修改指针变量。 POSIX的一个例子就是函数

int posix_memalign(void **memptr, size_t alignment, size_t size);

此函数分配至少size个字节的内存块,与alignment对齐。但它的返回值是一个错误代码。指向新分配的内存块的指针将写入*memptr。使用示例可能是:

static const size_t page_size = 4096; // Could get this value from sysconf().

void* new_copy_of_page( const void* const old_page )
/* Copies the page of memory at old_page to a new page of memory (aligned to
 * the page size).  This new page must be freed with free().  Returns a pointer
 * to the new page, or NULL if out of memory.
 */
{
  void *new_page = NULL; // Set by posix_memalign() to a new memory page.

  assert(old_page); // Check for valid input. 

  if ( 0 != posix_memalign( &new_page, page_size, page_size ) )
    return NULL; // Or handle out-of-memory error.

   // Otherwise, the allocation was successful.
   memcpy( new_page, old_page, page_size );
   return new_page;
}

这是一个有点人为的例子,因为标准库现在aligned_alloc()具有相同的功能和更简单的界面。