我是C / C ++的新手。
我正在阅读一些与树相关的编码问题,并遇到了这个双指针表示法。我们可以使用单个指针作为下面函数中的第一个参数来执行相同的操作,就像我们可以使用双指针一样。
void operate(struct Node *root, struct Node **head_ref){ //do something}
答案 0 :(得分:3)
有两种解释指针的方法;对某事物或数组的引用。考虑到这是一棵树,这可能是第一个:对另一个指针的引用。
C中函数的每个参数都是按值传递的,这意味着如果更改 函数中的指针,则不会更改外部。为了保证它也在外面改变,你可以使用对指针的引用:双指针。您可以考虑以下示例。
void function(int a) {
a = 5;
}
即使上面更改了a
,也不会在功能之外进行更改。但在另一个案例中,
void function(int * a) {
*a = 5;
}
值[{1}}也在函数外部更改。同样的思考过程可以应用于指针(也是一个值)。
答案 1 :(得分:0)
当你想要一个函数来处理malloc时,free是主要原因。
如果要封装内存分配,这很有用。
例如一些init(struct some_struct **),free(struct some_struct **)。 让函数免费处理malloc。而不是在堆栈上分配。
例如,包含未知长度的字符串的函数。
size_t pack_struct(char** data, const struct some_struct * some_struct)
{
/**
* @brief buffer
* @note verify the needed buffer length
*/
char buffer [256]; // temporary buffer
*data = 0;
//const char* package_pattern = "%cW ;%u.%u;%s%c";
size_t len = sprintf(buffer, weight_package_pattern,
START_CHARACTER,
some_struct->ts.tv_sec,
some_struct->ts.tv_usec,
some_struct->string_of_unknown_length, // but no more then buffer
STOP_CHARACTER);
if(len == 0) {
perror("sprintf failed!\n");
return len;
}
// len++; // for end character if wanna some, see sprintf description
*data = (char*)malloc(len*sizeof(char)); // memory allocation !
strncpy(*data, buffer, len);
return len;
}
但是在使用C ++编程时应该避免使用这种技术。
答案 2 :(得分:0)
分配内存时通常使用双指针。
#include <stdlib.h>
void new_malloc(void **p, size_t s) {
*p = malloc(s);
/* do something */
}
int main() {
int *p;
new_malloc((void **)&p, sizeof(int) * 10);
}