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